找到一个并更新。 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)
   })
 })

一些评论:

  1. 我使用猫鼬的 findOneAndUpdate 方法。据我所知,有相同的 node.js 方法,但代码可能不同。
  2. 让我们稍微分解一下代码:
  • 首先找到 username: "Some user name"
  • 撰写原始消息的用户
  • 然后您可以通过某个唯一值选择您需要的消息。在我的例子中,这只是时间戳: "messages.date": mssg.date 。同一用户不能 post 两条具有相同 Date.now() 时间戳的消息。
  • 然后您根据已选择的消息执行所需的操作:{$push: {"messages.$.likes": whoLiked}} 第二个美元符号代表选择正确的消息。好像是它的索引。