4

mongoドキュメントに配列を作成したので、次のようになります。

{ "_id" : ObjectId("4f59e19d0b7aab2903000004"), 
  "details" : { x:1, y:2 }
}

次に、新しい値を配列にプッシュしようとしています。

db.users.update({"_id" : ObjectId("4f59e19d0b7aab2903000004")},{$push: {"details": {"z":3}}});

ただし、エラーが発生します。

Cannot apply $push/$pushAll modifier to non-array

配列に情報を実際に追加できる唯一の方法は、ドット表記を使用して情報を追加することです。

db.users.update({"_id" : ObjectId("4f59e19d0b7aab2903000004")},{"details.z": 3});

それはうまくいくようですが、私が約30の値の配列を持っているとき、それは少し退屈に思えます。

わかりやすくするために、これらを手動で入力するだけでなく、リチウムPHPフレームワークを使用しているため、配列をループして「詳細」を付加することができます。それぞれの鍵に、しかし私はそれが必要であるとは思わない。値を配列にプッシュしない理由について私が見逃しているものはありますか?

(私のリチウムコードは次のとおりです:)

User::update(array('$push'=>array('details'=>array('z'=>3))), array('_id'=>$id))

ありがとう、

ダン

4

1 に答える 1

4

「詳細」は埋め込みドキュメントであり、配列ではありません。配列の場合は次のようになります([]は配列を示していることに注意してください)。

{ "_id" : ObjectId("4f59f0531ae8f3b5f92246fe"), 
       "details" : [ { "x" : 1 }, { "y" : 2 } ] }

次に$pushを実行すると、次のようになります。

db.users.update({"_id" : ObjectId("4f59f0531ae8f3b5f92246fe")}, 
                {$push : {"details": {"z":3}}})

期待どおりの結果が得られます。

db.users.find({"_id" : ObjectId("4f59f0531ae8f3b5f92246fe")})

{ "_id" : ObjectId("4f59f0531ae8f3b5f92246fe"), 
  "details" : [ { "x" : 1 }, { "y" : 2 }, { "z" : 3 } ] }

基本的に、配列ではなくドキュメントにプッシュしようとしています。

于 2012-03-09T12:19:03.513 に答える