私は、インベントリ内のアイテムを表す複数の埋め込みドキュメントを持つ複雑なmongodocを扱っています。文書全体は完全な在庫と考えることができます。キー 'セクション'には、個々のアイテムとその価格、説明などのデータを含む別のキー「アイテム」が含まれています。各アイテムにはGUIDがあり、個別に検索できます。Mongodbに埋め込まれたドキュメントを直接操作する
function (item_id) {
var pls = db.pricelists.findOne({'sections.items.item_id':item_id});
if (!pls) {
return null;
}
for (var sect in pls.sections) {
for (var item in pls.sections[sect].items) {
if (pls.sections[sect].items[item].item_id == item_id) {
return pls.sections[sect].items[item];
}
}
}
}
すべての作品は、これまで見つける:
私はこのようになりますIDで個々の項目のために狩りに保存された機能を書きました。問題は、この埋め込みドキュメントを変更して親ドキュメント内に保存したいときです。シェルから与えられる例:var item = db.eval('find_item(1)');
item.users_who_bought = [11,16];
item;
これは、正しい項目をコンソールに出力します。
{
"name" : "item00",
"order" : 0,
"item_id" : 1,
"hidden" : false,
"variants" : [
{
"price" : "0.56",
"label" : "variant000"
},
{
"price" : "1.56",
"label" : "variant001"
},
{
"price" : "2.56",
"label" : "variant002"
}
],
"desc" : "Sociis habitasse, integer pellentesque sit! Nisi purus tincidunt amet mus scelerisque amet, pid enim eros phasellus dolor sociis nunc dictumst sed nunc, integer hac!",
"users_who_bought" : [11,16]
}
この埋め込みアイテムのドキュメントを親ドキュメントに更新するためのクエリを作成する方法は紛失しています。私は(ITEM_IDは、ここでは例えば1としてハードコードされた)このような何かを試してみました:
db.pricelists.update({'sections.item.item_id': 1}, {$set: {'sections.item.item_id[1]': item}})
しかし、これは正しく動作しません。また、items配列に追加しようとします。
変更された埋め込みドキュメントのパスを、このような更新ステートメントに、ドキュメント内の値によって選択的にパスする方法はありますか?あるいは、私はこれを間違った方法で考えています。アイテムを再度見つけ出し、親ドキュメント全体を深く埋め込まれた新しい値で更新する別のストアドイテレータ関数を記述する必要がありますか?ありがとう!
正しく理解されているのは、配列内の要素自体がドキュメントでもあることです。このステートメントは '文字列フィールド名[items]'を使用して配列に追加できません。セクションとアイテムはどちらも配列なので、私はそれを仮定します。私は2つの位置演算子を使ってみました、1つはセクションの後に、もう1つはアイテムの後に、しかしそれは同じエラーを返します。 – DeaconDesperado
hm ...もしあなたがこのようなセクションを持っているなら、[[1、2]、[3、4]、[5,6]]}私はforEach()を使い、 。私が気付いていないより良い解決策があるかもしれませんが。 – ioseb