找到一个并更新。 Select 消息数组,select 消息对象和更新喜欢其中的数组
findOneAndUpdate. Select array of messages, select message object and update likes array inside it
我使用mongoose的findOneAndUpdate方法,但是无法得到结果。我总是得到相同的对象。没有错误。这是我的代码。
用户对象:
{
"_id" : ObjectId("6273b64b607b1d228795f067"),
"username" : "User1",
"mail" : "user@inbox.com",
"password" : "b$NrJ9E8xSz1iCfmIPY0snC.e6x4B/ymqtH.at9uUWaCXTQUwJi1eem",
"messages" : [
{
"message" : "Brand new message",
"date" : 1652508162106.0,
"author" : "User1",
"likes" : []
}
],
"__v" : 16
}
这是我的后端代码:
const {author} = req.params;
const {mssg, whoLiked} = req.body;
User.findOneAndUpdate({username: author, messages: mssg}, {$push: {likes: whoLiked}}, {new: true}, (err, user)=>{
err && console.log(err);
res.send(user)
})
})
没有更新。也许我试图以错误的方式选择消息……我知道,一次操作就可以做到这一点。但我想不通。大家说呢?
好的,我终于明白了。这是将喜欢的新人推送到喜欢数组的代码。
router.post("/:author/likeThePost", (req,res)=>{
const {author} = req.params;
const {mssg, whoLiked} = req.body;
console.log(mssg, whoLiked);
User.findOneAndUpdate({username: author, "messages.date": mssg.date}, {$push: {"messages.$.likes": whoLiked}}, {new: true}, (err, user)=>{
err && console.log(err);
res.send(user.messages)
})
})
一些评论:
- 我使用猫鼬的 findOneAndUpdate 方法。据我所知,有相同的 node.js 方法,但代码可能不同。
- 让我们稍微分解一下代码:
- 首先找到
username: "Some user name"
撰写原始消息的用户
- 然后您可以通过某个唯一值选择您需要的消息。在我的例子中,这只是时间戳:
"messages.date": mssg.date
。同一用户不能 post 两条具有相同 Date.now()
时间戳的消息。
- 然后您根据已选择的消息执行所需的操作:
{$push: {"messages.$.likes": whoLiked}}
第二个美元符号代表选择正确的消息。好像是它的索引。
我使用mongoose的findOneAndUpdate方法,但是无法得到结果。我总是得到相同的对象。没有错误。这是我的代码。 用户对象:
{
"_id" : ObjectId("6273b64b607b1d228795f067"),
"username" : "User1",
"mail" : "user@inbox.com",
"password" : "b$NrJ9E8xSz1iCfmIPY0snC.e6x4B/ymqtH.at9uUWaCXTQUwJi1eem",
"messages" : [
{
"message" : "Brand new message",
"date" : 1652508162106.0,
"author" : "User1",
"likes" : []
}
],
"__v" : 16
}
这是我的后端代码:
const {author} = req.params;
const {mssg, whoLiked} = req.body;
User.findOneAndUpdate({username: author, messages: mssg}, {$push: {likes: whoLiked}}, {new: true}, (err, user)=>{
err && console.log(err);
res.send(user)
})
})
没有更新。也许我试图以错误的方式选择消息……我知道,一次操作就可以做到这一点。但我想不通。大家说呢?
好的,我终于明白了。这是将喜欢的新人推送到喜欢数组的代码。
router.post("/:author/likeThePost", (req,res)=>{
const {author} = req.params;
const {mssg, whoLiked} = req.body;
console.log(mssg, whoLiked);
User.findOneAndUpdate({username: author, "messages.date": mssg.date}, {$push: {"messages.$.likes": whoLiked}}, {new: true}, (err, user)=>{
err && console.log(err);
res.send(user.messages)
})
})
一些评论:
- 我使用猫鼬的 findOneAndUpdate 方法。据我所知,有相同的 node.js 方法,但代码可能不同。
- 让我们稍微分解一下代码:
- 首先找到
username: "Some user name"
撰写原始消息的用户
- 然后您可以通过某个唯一值选择您需要的消息。在我的例子中,这只是时间戳:
"messages.date": mssg.date
。同一用户不能 post 两条具有相同Date.now()
时间戳的消息。 - 然后您根据已选择的消息执行所需的操作:
{$push: {"messages.$.likes": whoLiked}}
第二个美元符号代表选择正确的消息。好像是它的索引。