1

我有一个简单的文档,其中包含一系列产品。

{
    "products" : [
        {
            "amount" : 0,
            "id" : "9647562"
        }
    ],
}

我想删除数组中数量为 0 的所有对象。我认为这很容易:

db.shop.update({}, {"$pull": {"products": {"amount": 0} }});

这不起作用,但这样做:

db.shop.update({}, {"$pull": {"products": {"amount": 2} }});

所以基本上如果我将数字从 2 更改为 0,它就不再起作用了。如您所见,数量是整数,我也试图将其删除为整数,所以情况并非如此。我还能尝试什么?

4

1 回答 1

1

试试这个 :

db.shop.update({}, {"$pull": {"products": {"amount": 0} }},false,true);

文档摘录update

db.collection.update( criteria, objNew, upsert, multi )

所以,在这里你应该有 upsert = false 和 multi = true。原因:您的匹配条件{}意味着全部匹配,因此更新语句在匹配第一行后退出,并且不对其执行任何操作,要更改所有匹配行,您需要将标志提供multi为 true。

例子:

> db.newColl.find()
{ "_id" : ObjectId("500d262db869eab21b7fc6b0"), "products" : [ ] }
{ "_id" : ObjectId("500d2632b869eab21b7fc6b1"), "products" : [ { "amount" : 5, "id" : "9647562" } ] }
> 
> 
> db.newColl.update({},{"$pull": {"products": {"amount": 5 } }});
> db.newColl.find()
{ "_id" : ObjectId("500d262db869eab21b7fc6b0"), "products" : [ ] }
{ "_id" : ObjectId("500d2632b869eab21b7fc6b1"), "products" : [ { "amount" : 5, "id" : "9647562" } ] }
> 
> 
> db.newColl.update({},{"$pull": {"products": {"amount": 5 } }},false,true);
> db.newColl.find()
{ "_id" : ObjectId("500d2622b869eab21b7fc6ae"), "products" : [ ] }
{ "_id" : ObjectId("500d2632b869eab21b7fc6b1"), "products" : [ ] }
于 2012-07-23T10:27:58.483 回答