2011-12-08 8 views
0

私は、インベントリ内のアイテムを表す複数の埋め込みドキュメントを持つ複雑な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配列に追加しようとします。

変更された埋め込みドキュメントのパスを、このような更新ステートメントに、ドキュメント内の値によって選択的にパスする方法はありますか?あるいは、私はこれを間違った方法で考えています。アイテムを再度見つけ出し、親ドキュメント全体を深く埋め込まれた新しい値で更新する別のストアドイテレータ関数を記述する必要がありますか?ありがとう!

答えて

1

配列内のアイテムを変更したい場合は、条件付き$ pull firstと$ push updatedアイテムを使用することをお勧めします。

あなたの場合は、セクション配列を持っているので少し複雑です。したがって、あなたはそれに$演算子を使用し、次にitems配列に$ pull/$ pushを使用する必要があります。

0

あなたが正しく理解しているのは、特定の位置で配列の値にアクセスして変更することです。あなたは[1]、$は.update()メソッドの最初のパラメータで指定された最初の一致を意味し使用する必要はありませんつまり

db.pricelists.update(
    {'sections.item.item_id': 1}, 
    {$set: {'sections.item.item_id.$': item}} 
) 

:この場合、あなたは少しあなたのクエリを変更することができます。詳細については、位置演算子を参照してください:http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

+0

正しく理解されているのは、配列内の要素自体がドキュメントでもあることです。このステートメントは '文字列フィールド名[items]'を使用して配列に追加できません。セクションとアイテムはどちらも配列なので、私はそれを仮定します。私は2つの位置演算子を使ってみました、1つはセクションの後に、もう1つはアイテムの後に、しかしそれは同じエラーを返します。 – DeaconDesperado

+0

hm ...もしあなたがこのようなセクションを持っているなら、[[1、2]、[3、4]、[5,6]]}私はforEach()を使い、 。私が気付いていないより良い解決策があるかもしれませんが。 – ioseb

関連する問題