从集合中的数组中删除对象[性能/最佳实践/问题]

时间:2014-09-23 06:16:04

标签: javascript mongodb meteor

所以我有一个名为Pages的Collection,在这个集合中,每个页面都有一个Widgets数组,每个widget都有一个uuid,我用它来识别每个widget。

Pages [ 
     widgets : [{uuid : "someuuid"}, {uuid : "otheruuid"}]
]

我需要从widgets数组中删除一个项目并更新该集合。所以我在这篇文章about how to remove items in an array (Mongo DB approach)中读到了。 帖子的例子:

db.people.update({"name":"dannie"}, {'$pull': {"interests": "guitar"}})

我试过了,但它对我的项目不起作用,不知道为什么,我不知道为什么,我不知道怎么写mongodb指令

因为我必须继续工作,所以我做了类似的事情:

//random function to get index of an object in the array;
var indexOf = myfunction.getIndexOfObject()
if (indexOf > -1) {
    //remove the item in the array of the Active Page
    activePage.widgets.splice(indexOf, 1);
    //update the collection
    Pages.update({_id : activePage._id},activePage); 
}

我想知道我的方法是否正确;它没有任何问题,工作正常。但我不知道在性能或安全性或其他任何事情上是否会有任何问题或警告,因为文档方法完全不同:

文档方法:

http://docs.mongodb.org/manual/reference/operator/update/pull/

db.cpuinfo.update(
                   { flags: "msr" },
                   { $pull: { flags: "msr" } },
                   { multi: true }
                 )

感谢您的支持。

1 个答案:

答案 0 :(得分:1)

虽然你正在做的事情似乎是正确的但我厌倦了使用$ pull来更新数组我可以做到。 我创建了一个示例页面集合并插入了以下文档

db.pages.insert({widgets : [{uuid : "someuuid1"}, {uuid : "otheruuid2"}]});
db.pages.insert({widgets : [{uuid : "someuuid2"}, {uuid : "otheruuid3"}]});
db.pages.insert({widgets : [{uuid : "someuuid3"}, {uuid : "otheruuid3"}]});
db.pages.insert({widgets : [{uuid : "someuuid3"}, {uuid : "otheruuid4"}]});

我运行更新查询以拉取元素

db.pages.update({},{$pull : {"widgets" : {uuid : "otheruuid3"}}}, {multi:true});

我可以看到文件2和3没有" uuid:otheruuid3"在小部件中。不确定你面临的问题