2013-10-17 5 views
5

埋め込まれた配列からオブジェクトを削除しようとしています($pull)。この例では

{ 
    one : "All", 
    one : [ 
     { 
     name: "People", 
     two: [ 
      { 
      three_id: 123, 
      three: "Jonny", 
      }, 
      { 
      three_id: 456, 
      three: "Bobby", 
      } 
     ] 
     }, 
     { 
     name: "Animals", 
     two: [ 
      { 
      three_id: 828, 
      three: "Cat", 
      }, 
      { 
      three_id: 282, 
      three: "Dog", 
      } 
     ] 
     } 
    ] 
} 

、私はボビー」を取り除くしようとしている:(ジャバスクリプト/ Node.jsのドライバを使用して)ここ

は、1つ、2つは、三つのレベルがサンプルデータであり、 "

私が欲しい場合、私は正常にこのように、「3つのレベル」で文書を一致させることができます:

db.test.find({"one.two.three_id" : 456}); 

をしかし、私はupdateを使用してそのレコードを除去する方法は考えてきません。ここではいくつかの試み、作品のどれも、次のとおりです。

// failed attempts 
db.test.update({"one.two.three_id" : 456}, {$pull:{'one.$.two.$.three_id': 456}}); 
db.test.update({"one.two.three_id" : 456}, {$pull:{'three_id': 456}}); 

// deletes entire level two "People" 
db.test.update({"one.two.three_id" : 456}, {$pull: {one: {two : {$elemMatch: {'three_id': 456}}}}}); 

私はあなたが2の位置$ operatorsを使用できないことを読んで、あなたは二番目のインデックス位置を知っている必要があること。ただし、削除したい埋め込み辞書のインデックスを使用する必要はありません。

参照: MongoDBのプル

http://docs.mongodb.org/manual/reference/operator/update/pull/

答えて

4

であなたの$pullオブジェクトのキーの値は、あなたがターゲットとしている配列のパスである必要があります。それは我々が複数のネストレベルにわたって一致しているにもかかわらず動作しますので、それは$のように見える

db.test.update(
    {'one.two.three_id': 456}, 
    {$pull: {'one.$.two': {three_id: 456}}} 
); 

は、このケースで最初マッチしたアレイレベルのインデックスを表します。これが動作するように表示されます。

+0

お返事ありがとうございます。私はちょうど試しましたが、100回目の '$ err:サポートされていない投影オプション:1、$ 2、コード:13097 'になります。mongo shellを使ってテストしています。 –

+0

上記のコメントを無視してください。あなたのソリューションは機能します。私は再びそれを試して、私は欠けている期間があった。すばらしいです。 –

+0

学習上の注意:単純なクエリを使用して式を短縮しようとしましたが、「配列を含む対応するクエリフィールドがない位置演算子を適用できません」というメッセージが表示されました。したがって、クエリは$ operatorの使用を設定します。 –

関連する問題