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が必要です。理由:一致基準はすべて一致することを意味します。したがって、更新ステートメントは最初の行を一致させた後に終了し、何もしません。一致するすべての行を変更するには、フラグをtrueとして指定{}する必要があります。multi

例:

> 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 に答える