1

仅当满足某些条件时,我才想将元素从数组中拉出

这是我的文档结构:

{
   _id: "userId",
   posts: [{
      _id: "postId",
      comments:[{
         _id: "commentId",
         userid: "some id of an user" // USER
      },{
         _id: "commentId2",
         userid: "some id of an user2"
      }]
   }]
}

我想使用给定的commentIdcomments从数组中删除元素。仅当is时才应这样做。如果不满足该条件,则表示该评论不属于想要删除它的用户,因此我拒绝了它。useridUSER

尝试过:

 Post.findOneAndUpdate(
      {
        _id: mongoose.Types.ObjectId(userId)
      },
      {
        $pull: {
          $cond: [
            {
              "posts.$[post].comments.$[comment].userid": {
                $eq: USER
              }
            },
            {
              $pull: {
                comments: {
                  _id: mongoose.Types.ObjectId(commentId)
                }
              }
            }
          ]
        }
      },
      {
        arrayFilters: [
          {
            "comment._id": mongoose.Types.ObjectId(commentId)
          },
          {
            "post._id": mongoose.Types.ObjectId(postId)
          }
        ]
      }
    )

上面的代码不起作用,我被困在那里,我不知道如何继续。也许有人知道如何解决这个问题。

4

1 回答 1

1

您可以尝试以下查询:

Post.findOneAndUpdate(
      {
        _id: mongoose.Types.ObjectId(userId) // Fetches actual document
      },
      // Any matching object that has these fields/values in comments array will be pulled out
      {
        $pull: {"posts.$[post].comments": { _id : mongoose.Types.ObjectId(commentId), "userid": USER }}},
      {
        arrayFilters: [
          {
            "post._id": mongoose.Types.ObjectId(postId) // Checks which object inside `posts` array needs to be updated
          }
        ]
      }
    )

注意:在 mongoose 中使用一个选项{ new : true }来返回更新的文档,或者在 shell 中使用{ returnNewDocument : true }

于 2020-05-20T20:38:34.750 回答