在mongoose中从数组中删除一个项目的mongodb等效方法

3

文档:

{
    "_id" : ObjectId("5399ba7f8035beb2d4717cc0"),
    "listName" : "firstList",
    "items" : [
        {
            "pName" : "iPad ",
            "pDesc" : "iPad aiiir",
            "ownerID" : ObjectId("5399b596c501732dd4d13923"),
            "_id" : ObjectId("5399e2cc2d7b0349d89d2b44"),
            "dateAdded" : ISODate("2014-06-12T17:26:36.282Z")
        },
        {
            "pName" : "iPhone ",
            "pDesc" : "5s",
            "ownerID" : ObjectId("5399b596c501732dd4d13923"),
            "_id" : ObjectId("5399e2cc2d7b0349d89d2b44"),
            "dateAdded" : ISODate("2014-06-12T17:26:36.282Z")
        }
]}

我希望能够在不知道文档的 _id,只知道元素的 id 的情况下,从 "数组" 项中删除一个元素,我有这个查询,可以找到该元素,在 mongodb shell 中有效,但在 mongoose 中无效。

db.lists.find( {items:
               {$elemMatch:{'_id':ObjectId("5399b596c501732dd4d13923")}}} , 
               {"items.$":1});

你知道为什么吗?

请问你能把它翻译成mongoose的等效代码吗?

如果只知道一个文档的_id,我应该如何从列表中获取该项?

2个回答

4
这应该可以解决问题:
db.lists.update(
    {}, 
    { $pull: {"items": {"_id" :ObjectId("5399e2cc2d7b0349d89d2b44") }},
    { multi: true }})

对于集合中的每个文档({}表示空查询),它会删除提供的_id(在items数组中)的每个项。如果没有使用multi选项,则只有找到的第一个文档会受到影响。


但是由于ObjectId是唯一的,我真的不需要它了吗? - Ben
1
如果你在谈论 multi: true,那么在你的情况下,你是正确的,你不需要它。 - Charleshaa

1

好的,我通过Yves Amsellem找到了解决我的问题的mongoose方案。 他的答案的mongoose版本如下:

    Lists.update(
                 {}, 
                 {$pull: {items: {_id: iProductId}}},  
                 { multi: true },
                 function(err, data){
                      console.log(err, data);
                 }
    );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接