2016-04-12 15 views
4

オブジェクトの配列内の配列から項目を削除するMongoDB:は、私はこのようになります文書を持って

{ 
    "_id" : ObjectId("56fea43a571332cc97e06d9c"), 
    "sections" : [ 
    { 
     "_id" : ObjectId("56fea43a571332cc97e06d9e"), 
     "registered" : [ 
     "123", 
     "e3d65a4e-2552-4995-ac5a-3c5180258d87" 
     ] 
    } 
    ] 
} 

私はのみ特定のセクションのregistered配列に'e3d65a4e-2552-4995-ac5a-3c5180258d87'を削除したいです_id'56fea43a571332cc97e06d9e'である。

私の現在の試みはこのようなものですが、元の文書をそのまま返します。

db.test.findOneAndUpdate(
{ 
    $and: [ 
    {'sections._id': ObjectId('56fea43a571332cc97e06d9e')}, 
    {'sections.registered': 'e3d65a4e-2552-4995-ac5a-3c5180258d87'} 
    ] 
}, 
{ 
    $pull: { 
    $and: [ 
     {'sections._id': ObjectId('56fea43a571332cc97e06d9e')}, 
     {'sections.registered': 'e3d65a4e-2552-4995-ac5a-3c5180258d87'} 
    ] 
    } 
}) 

私は$pullにして見てきたが、私はそれが別の配列を含むネストされたオブジェクトの配列に動作させる方法を見つけ出すように見えることはできません。 $pullの例はすべて、1つのレベルの入れ子しか扱っていないようです。一致するエントリを、 sectionsアレイの項目の配列から、私が提供する_idで削除するにはどうすればよいですか?

答えて

2

配列から要素を削除するには、位置指定の$更新演算子を使用する必要があります。これは、「セクション」がサブドキュメントの配列であるためです。

db.test.findOneAndUpdate(
    { "sections._id" : ObjectId("56fea43a571332cc97e06d9e") }, 
    { "$pull": { "sections.$.registered": "e3d65a4e-2552-4995-ac5a-3c5180258d87" } } 
) 
+0

これは、セクションのいずれかで、 ' "e3d65a4e-2552から4995-ac5a-3c5180258d87"'の任意のインスタンスを削除しませんか?私は特定のセクションの登録された配列からその文字列を削除するだけです。 – jergason

+0

テスト後、これはうまくいくように見えましたが、理由はわかりません。どのようにして、 '_id'と一致する特定のセクションにのみ$ pull演算子を適用することがわかりますか? – jergason

+0

私は実際に人間のような '$'のドキュメントを読んでいます。意味あり。ご協力いただきありがとうございます。 – jergason

関連する問題