使用$ pull和$ cond运算符从数组中删除元素

时间:2020-05-20 20:09:34

标签: mongodb mongodb-query

我只想在满足某些条件的情况下才将元素拉出数组

这是我的文档结构:

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

我想从comments数组中删除具有给定 commentId 的元素。仅当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)
          }
        ]
      }
    )

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

1 个答案:

答案 0 :(得分: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
          }
        ]
      }
    )

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