0

今日は、MongoDB を使用する最初の日です

私のコレクション形式:

{ "_id" : "ObjectId" :"4f2ff1d00cf2f86576f91a91"),
"fishStuff" : [
{
    "name" : "GreatWhite",
    "fID" : 50
},
{
    "name" : "Hammerhead",
    "fID" : 51
},
{
    "name" : "White",
    "fID" : 60
}
], "fishSpecies" : "Oceanic"

...

最初の子はこの「fishStuff」のグループに存在するため、3 番目の子 (名前: White) を削除するシェル (まっすぐな mongo) にクエリを記述したいと考えています。

「where」句は次のようにする必要があると思います:

{fishSpecies:"Oceanic","fishStuff.fID":50, "fishStuff.fID:60}

では、「60」子要素全体を削除するにはどうすればよいですか? 「50」が同じ「fishStuff」グループ/配列にもある場合、コレクション内のすべての「60」要素を削除したいと考えています。また、「where」節に fishSpecies を含めた理由は、複数の fishSpecies の可能性があるためです。

アップデート:

以下の 2 人のコメンターが残した提案を試しましたが、(以下のカウントを実行した後) fID 50 と 60 の両方を含む子オブジェクト セットの 7 つのインスタンスをまだ取得しています。

> db.fish.update({fishSpecies:"oceanic","fishStuff.fID":50}, {$pull : {"fishStuff" : { fID : 60}}},false, true)
> db.fish.find({"fishSpecies":"oceanic","fishStuff.fID":50, "fishStuff.fID":60}).count()
7

ゼロ レコードが更新されるため、 multi: true フラグは機能しません (または正しく実装していません)。

4

2 に答える 2

0

私はこれがあなたが探しているものだと信じています...

mycollection で、Oceanic AND fID = 50 の fishSpecies に一致するドキュメントがないかチェックします。一致する場合は、fID = 60 要素を削除します。multi:true はコレクション全体をスキャンします。

db.mycollection.update({'fishSpecies': 'Oceanic','fishStuff':{fID:50}}, {$pull:{'fishStuff': {fID: 60}}}, {multi:true})
于 2013-04-03T08:03:46.297 に答える
0

序数の位置 (インデックス) に基づいて削除しようとしている場合は、直接削除できません。

配列内の項目を $unset してから $pull する手法を使用できます。

db.mycollection.update({}, {$unset : {"fishStuff.50" : 1 }})
db.mycollection.update({}, {$pull : {"fishStuff" : null}})

ただし、これは fId を考慮せず、配列内のドキュメントの位置のみに依存していることに注意してください。

fId に一致するアイテムを取得するには、次のことを行う必要があります。

 db.mycollection.update({}, {$pull : {"fishStuff" : { fId : 50}}})

編集:

ドキュメントの配列に fId == 50 と fId == 60 が含まれている配列から fId == 50 の要素を削除したい場合は、次のことができるはずです。

db.mycollection.update({
    "fishSpecies":"oceanic",
    "fishStuff.fId": { $all : [50,60]}}, 
    // update
    {$pull : {"fishStuff" : { fId : 50}}
})
于 2013-04-03T00:26:46.387 に答える