0

厄介な問題があります。基準がシステム内の複数のユーザーに一致する場合でも、そのうちの1人だけが特定の配列をプルしているということです。

ユーザーは次のようになります。

{
    "_id" : ObjectId("4ff696cf246951c8cea8506c"),
    "campaigns" : [
        {
            "userchannel" : 1,
            "id" : ObjectId("4ff59640acf479392600015b"),
            "name" : "test3"
        }
    ],
}

1人のユーザーが複数のキャンペーンを持つことができますが、同じ名前のキャンペーンは1つだけです。キャンペーンを削除すると、ユーザーを更新したいのですが、このキャンペーンを含むユーザーは削除されます。を含むキャンペーンを持つユーザーのみをuserchannel : 1削除する必要があります。

私は現在これを使用しています:

db.users.update({'campaigns.userchannel' : 1}, {$pull : {'campaigns' : {'id': ObjectId("4ff59640acf479392600015b")}}})

ただし、削除されるのは1人のユーザーのキャンペーンのみです。このクエリを改善して、すべてのユーザーから特定のキャンペーンを削除するにはどうすればよいですか?

4

2 に答える 2

4

単一の更新を行っています。MongoDB更新のデフォルトの動作は、RDBMSで一般的なすべての一致するドキュメントではなく、基準に一致する最初のドキュメントのみを変更することです。

更新には署名がありますupdate(criteria, update, upsert, multiple)。最後のパラメーターは、最初のパラメーターではなく、一致するすべてのドキュメントを更新するようにMongoDBに指示するブール値です。

更新を次のように変更します:

db.users.update({'campaigns.userchannel' : 1}, {$pull : {'campaigns' : {'id': ObjectId("4ff59640acf479392600015b")}}}, false, true)
于 2012-07-06T09:29:09.303 に答える
1
db.users.update({"campaigns.userchannel" : 1}, {$pull : {"campaigns" : {"id": ObjectId("4ff59640acf479392600015b")}}},false,true) 

アップサートの場合は3番目のパラメーター、マルチの場合は4番目のパラメーター。したがって、multiをtrueに設定する必要があります

于 2012-07-06T09:39:46.090 に答える