MongoDB upsert嵌入式文档

5
我每天有一个关于每个仪表的文档。如果数据数组中没有整个文档,我该如何添加另一个子文档并创建整个文档?
可以使用upsert来实现这个目的吗?
如果文档已存在,则结果将是:
谢谢!
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


我每天必须执行400000个addToSet操作...每个文档有96个数据。这似乎很慢...有其他方法可以做到吗? - hotips
如上所述,通过以这种方式增加值数组,您将触发多个移动 - 这将导致减速,除非您以某种方式限制数组并可以预测其最大大小 - 然后您可以适当地填充它,更新将更快。 如果您无法这样做,那么也许您应该考虑使用不同的架构,并将数据作为另一个集合而不是作为嵌入式数组。 - Adam Comerford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接