5

1 メートルあたり 1 日あたりのドキュメントがあります。サブドキュメントが存在しない場合、データ配列に別のサブドキュメントを追加してドキュメント全体を作成するにはどうすればよいですか?

{
  "キー": "20120418_123456789",
  "データ":[
     {
     「メーター」:123456789、
     "Dt": ISODate("2011-12-29T16:00:00.0Z"),
     「エネルギー」:25、
     "PMin": 11,
     "PMax": 16
     }
  ]、
  "config": {"someparam": 4.5}
}

その目的で upsert を使用できますか?

ドキュメントが存在する場合、結果は次のようになります。

{
  "キー": "20120418_123456789",
  "データ":[
     {
     「メーター」:123456789、
     "Dt": ISODate("2011-12-29T16:00:00.0Z"),
     「エネルギー」:25、
     "PMin": 11,
     "PMax": 16
     }、
     {
     「メーター」:123456789、
     "Dt": ISODate("2011-12-29T16:15:00.0Z"),
     「エネルギー」:22、
     "PMin": 13,
     "PMax": 17
     }
  ]、
  "config": {"someparam": 4.5}
}

前もって感謝します

4

1 に答える 1

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

于 2012-04-18T10:33:05.790 に答える