【问题标题】:Mongodb upsert embedded documentMongodb upsert 嵌入文档
【发布时间】:2012-04-18 09:35:10
【问题描述】:

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

{ “关键”:“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} }

提前致谢

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    我认为您想要的是 $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

    【讨论】:

    • 我必须每天执行 400000 个 addToSet... 每个文档 96 个数据。它似乎很慢......还有其他方法吗?
    • 如前所述,您将通过以这种方式增长数组值来触发多个移动 - 这将导致速度变慢,除非您以某种方式绑定数组并可以预测其最大大小 - 然后您可以适当地填充它,并且更新会快得多。如果你不能这样做,那么也许你应该考虑使用不同的模式并将数据放在另一个集合中,而不是作为嵌入式数组。
    猜你喜欢
    • 1970-01-01
    • 2020-09-06
    • 2016-11-11
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 2018-08-21
    • 2012-08-29
    • 1970-01-01
    相关资源
    最近更新 更多