Mongoose如何通过数组ID来查找并拉出其特定的子文档?

时间:2017-11-23 05:54:39

标签: mongodb mongoose

我有以下文件:

{
   _id: ObjectId("59e4540bf14f1607b90ffb81"),
   likedBy: [
     {
        "userId" : ObjectId("59edd922df2339579fc2a528"),
        "_id" : ObjectId("5a13c199f93b7ab1004c4318")
     },
     {
        "userId" : ObjectId("59edd922df2339579fc2a448"),
        "_id" : ObjectId("5a13c199f93b7ab1004c4412")
     }
   ]
},
{
   _id: ObjectId("59e4540bf14f1607b90ffb83"),
   likedBy: [
     {
        "userId" : ObjectId("59edd922df2339579fc2a528"),
        "_id" : ObjectId("5a13c199f93b7ab1004c4323")
     },
     {
        "userId" : ObjectId("59edd922df2339579fc2a448"),
        "_id" : ObjectId("5a13c199f93b7ab1004c6423")
     }
   ]
}

我想要做的是查找其ID在["59e4540bf14f1607b90ffb81", "59e4540bf14f1607b90ffb83"]中的所有文档,并删除其userId59edd922df2339579fc2a528的子文档。我想在一个查询中从特定文档(文档数组)中删除特定用户的所有喜欢。 循环通过id数组我可以做,但我想传递id和拉。 我当前的查询使用一个id:

post
  .findByIdAndUpdate(postId, {$pull: {likedBy: {userId: userId}}}, {new: true}, function (err, post) {
    if (err) {
      sendJsonResponse(res, 404, err);
    } else {
      sendJsonResponse(res, 204, post);
    }
  });

我想要的是传递一个post id数组,并在所有匹配的文档中拉出特定用户的喜欢。

1 个答案:

答案 0 :(得分:1)

试试这个:

post.update(
    {
        _id: {
            $in: [
                ObjectId("59e4540bf14f1607b90ffb83"),
                ObjectId("59e4540bf14f1607b90ffb81")
            ]
        }
    },
    {
        $pull: {
            likedBy: {
                $or: [
                    { userId: ObjectId("59edd922df2339579fc2a448") },
                    { userId: ObjectId("59edd922df2339579fc2a528") }
                ]
            }
        }
    },
    {
        multi: true
    },
    function(err, rawResponse) {
        /*...*/
    }
);