5

我每天每米有一个文件。如果他不存在,我如何在数据数组中添加另一个子文档并创建整个文档?

{
  “关键”:“20120418_123456789”,
  “数据”:[
     {
     “计”:123456789,
     "DT": ISODate("2011-12-29T16:00:00.0Z"),
     “能源”:25,
     “PM”:11,
     “最大峰值”:16
     }
  ],
  “配置”:{“someparam”:4.5}
}

我可以为此目的使用 upsert 吗?

结果将是如果文档存在:

{
  “关键”:“20120418_123456789”,
  “数据”:[
     {
     “计”:123456789,
     "DT": ISODate("2011-12-29T16:00:00.0Z"),
     “能源”:25,
     “PM”:11,
     “最大峰值”:16
     },
     {
     “计”:123456789,
     "DT": ISODate("2011-12-29T16:15:00.0Z"),
     “能源”:22,
     “Pmin”:13,
     “最大峰值”:17
     }
  ],
  “配置”:{“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 回答