質問

私は私の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))
.

ありがとう、

DAN

役に立ちましたか?

解決

"details" is an embedded document, not an array. If it was an array it would look like this (note the [] indicating an array):

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

If you then do a $push:

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

You get the expected result:

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

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

Basically you are trying to push to a document, not an array.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top