2017-10-13 5 views
-1

どのようにキーで配列要素を削除しますか?MongoDBのキーで特定のサブ要素を削除するには

ドキュメントは名前でキーを識別するのと同じくらい簡単だと思われますが、これはうまくいかないようです。例えば

、下の画像の配列、および59db1c3654819952005897のキーで、私は要素(以下のコードはエラーを生成しませんが、何も削除されません)を削除することができませんでしだ:

updateOne(['_id' => 34], ['$pull' => ["images" => "59db1c3654819952005897"]]) 

をここでは、データ構造は次のとおりです。あなたのpullクエリがimagesの値が59db1c3654819952005897に等しく、あなたのケースでは、それは真実ではない文書を探しているので

"_id" : 34, 
"images": [ 
    { 
     "59db1c3654819952005897": { 
      "name": "1024x1024.png", 
      "size": "19421", 
      "sort": 2 
     } 
    }, 
    { 
     "59db1c3652cda581935479": { 
      "name": "200x200.png", 
      "size": "52100", 
      "sort": 3 
     } 
    } 
] 

答えて

1

あなたが抱えている問題があります。

あなたが指定したのparamsとfindクエリを実行しようとしても、それは結果返さないでしょう。

db.getCollection('collection').find({ 
    'images': '59db1c3654819952005897' 
}); 

それを解決するために、あなたが取得することができますクエリを見つける必要がありますが、あなたの次のようになります文書は、:

db.getCollection('collection').updateOne({'_id': 34}, { 
    '$pull': { 
     'images': { 
      '59db1c3654819952005897': { 
       '$exists': true 
      } 
     } 
    } 
}); 

db.getCollection('collection').find({ 
    'images': { 
     '59db1c3654819952005897': { 
      '$exists': true 
     } 
    } 
}); 

今すぐあなたの$pullクエリを更新します

だからPHPでそれは次のようになります。つまり

$id = '59db1c3654819952005897'; 
updateOne(['_id' => 34], ['$pull' => [ 
    'images' => [ 
     $id => [ 
      '$exists' => true 
     ] 
    ] 
]]); 

が、59db1c3654819952005897は値34_idとドキュメントの内部に存在する場合images配列に引っ張るために起こっています。

+0

私はそれが理にかなっていると思います...キーがあれば、「存在すれば」を加えなければならないということは奇妙です。 ありがとう! – kylex

+1

'key'を' value'として比較しているからです!どういたしまして :) –

関連する問題