簡體   English   中英

Mongodb upsert嵌入式文檔

[英]Mongodb upsert embedded document

我每天每米都有一份文件。 如何在數據數組中添加另一個子文檔並創建整個文檔(如果它不存在)?

{
  "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}
}

提前致謝

我想你想要的是$ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM