4

我有一个看起来有点像的模式:

var postSchema = new Schema({
   created: { type: Date, default: Date.now },
   updated: { type: Date, default: Date.now },
   comments: { type: [Schema.ObjectId], ref: 'Comment' }
});

所以我的评论集合是引用我的评论模式/集合的对象 id 的集合。

我需要在查询时删除其中一些,所以我正在尝试这个:

var comments = [1, 2, 4];    

Post.update({ _id: post_id}, {'$pullAll': {comments: comments }})
  .exec(function(err) {
     // How to remove documents with 1, 2, 4 ids from a Comment collection properly
});

执行上面的代码后,我从 Post.comments 中删除了评论 ID,但我还需要从“评论”集合中删除这些评论。我该怎么做?

编辑:我怎样才能获得实际上没有被删除的文档的 ID。简单的例子:

Post.comments = [1, 2, 3]; 
Post.update({ _id: post_id}, {'$pullAll': {comments: [1,2]}});

在上面的代码中 Post.comments 只有 1,2,3,但我们试图拉 [1,2],所以我需要知道 Post.comments 中不存在 id=3 并且我不需要将其从“评论”集合中删除。

4

2 回答 2

1

您可以使用findAndModify命令发出更新并在value命令结果的属性中返回原始文档。您应该可以毫无问题地将返回的comments字段与$pullAll查询中的 ID 进行比较,以辨别实际删除了哪些 ID。

$ mongo
MongoDB shell version: 2.2.0-rc1
connecting to: test
> db.posts.drop()
true
> db.posts.insert({ _id: 1, comments: [1,2,3] })
> db.runCommand({
... findAndModify: "posts",
... query: { _id: 1 },
... update: { $pullAll: { comments: [1,2,4] }},
... })
{
    "value" : {
        "_id" : 1,
        "comments" : [
            1,
            2,
            3
        ]
    },
    "lastErrorObject" : {
        "updatedExisting" : true,
        "n" : 1
    },
    "ok" : 1
}

正如 JohnnyHK 在他的回答中提到的那样,最好使用remove()查询和$in运算符来删除评论文档本身。

注意:我上面的例子使用了 Mongo JS shell。看起来 Mongoose 最近获得了一个辅助方法findAndModify(请参阅:PR #803),尽管如果您使用的版本中没有该数据库命令,您始终可以执行该命令。

于 2012-08-20T15:44:04.980 回答
1

为此使用$in运算符:

var comments = [1, 2, 4];    

Post.update({ _id: post_id}, {'$pullAll': {comments: comments }})
  .exec(function(err) {
    Comment.remove({ _id: { $in: comments }}, function(err, numberRemoved) {
      // The identified comments are now removed.
    });
  });
});
于 2012-08-20T12:30:52.220 回答