2012-04-18 12 views
5

1日あたりの文書数は1メートルです。データ配列に別のサブ文書を追加し、存在しない場合は文書全体を作成するにはどうすればよいですか?Mongodb upsert埋め込み文書

 
{ 
    "key": "20120418_123456789", 
    "data":[ 
    { 
    "Meter": 123456789, 
    "Dt": ISODate("2011-12-29T16:00:00.0Z"), 
    "Energy": 25, 
    "PMin": 11, 
    "PMax": 16 
    } 
    ], 
    "config": {"someparam": 4.5} 
} 

この目的でupsertを使用できますか?文書が存在する場合

結果は以下のようになります。事前に

 
{ 
    "key": "20120418_123456789", 
    "data":[ 
    { 
    "Meter": 123456789, 
    "Dt": ISODate("2011-12-29T16:00:00.0Z"), 
    "Energy": 25, 
    "PMin": 11, 
    "PMax": 16 
    }, 
    { 
    "Meter": 123456789, 
    "Dt": ISODate("2011-12-29T16:15:00.0Z"), 
    "Energy": 22, 
    "PMin": 13, 
    "PMax": 17 
    } 
    ], 
    "config": {"someparam": 4.5} 
} 

感謝を

答えて

9

私が何をしたいことは$ addToSetコマンドだと思う - それはない場合にのみ、配列に要素をプッシュしますすでに存在しています。

db.meters.findOne() 
{ 
    "_id" : ObjectId("4f8e95a718bc9c7da1e6511a"), 
    "config" : { 
     "someparam" : 4.5 
    }, 
    "data" : [ 
     { 
      "Meter" : 123456789, 
     } 
    ], 
    "key" : "20120418_123456789" 
} 

今すぐ実行します:私は簡潔にするためのビットがあなたの例を簡略化してきました

db.meters.update({"key" : "20120418_123456789"}, {"$addToSet": {"data" : {"Meter" : 1234}}}) 

そして、我々は、更新されたバージョンを取得:

db.meters.findOne() 
{ 
    "_id" : ObjectId("4f8e95a718bc9c7da1e6511a"), 
    "config" : { 
     "someparam" : 4.5 
    }, 
    "data" : [ 
     { 
      "Meter" : 123456789, 
     }, 
     { 
      "Meter" : 1234 
     } 
    ], 
    "key" : "20120418_123456789" 
} 

をもう一度同じコマンドを実行し、その結果変わらない。

注:特にこのフィールドが無制限で、このように更新することで頻繁に(比較的高価な)移動を引き起こす場合は、これらのドキュメントを増やすことになります。これを緩和する方法については、

http://www.mongodb.org/display/DOCS/Padding+Factor#PaddingFactor-ManualPadding

+0

私は一日あたり400000 addToSet ...文書ごとに96件のデータを行う必要があります。それは遅いようです...それを行うための他の方法はありますか? – hotips

+0

上記のように、配列を何らかの方法でバインドして最大サイズを予測できる場合を除いて、スローダウンの原因となる値の配列を増やして複数の移動をトリガーしようとしています。更新ははるかに高速になるだろう。あなたがそれを行うことができない場合は、おそらく別のスキーマを考慮し、組み込み配列ではなく別のコレクションにデータを置くべきです。 –

関連する問題