【发布时间】:2014-08-22 08:45:58
【问题描述】:
我需要通过“默认值”文档更新 MongoDB 中的所有文档:如果 DB 文档中不存在“默认值”的任何部分 - 添加此部分,否则不要修改此部分。
我尝试通过存储函数来实现:加载文档,递归更新,保存。
插入DefValues.js:
db.system.js.save({_id: "DoInsertDefValues", value: function(data, defValues)
{
var modified = false;
for (var prop in defValues)
{
if (data[prop] === undefined)
{
data[prop] = defValues[prop];
modified = true;
}
else if (typeof defValues[prop] === "object")
modified |= DoInsertDefValues(data[prop], defValues[prop]);
}
return modified;
}});
db.system.js.save({_id: "InsertDefValues", value: function()
{
var defValues = {
//...
};
var docs = db.collection.find();
docs.forEach(function(data)
{
if (DoInsertDefValues(data, defValues))
db.collection.save(data);
});
}});
db.loadServerScripts();
InsertDefValues();
然后我通过 mongo shell 执行它:
mongo collection insertDefValues.js
问题是这种方法太慢了(测试数据的 2K 文档需要 30 秒,生产数据库要大得多)。我使用没有批量更新的 MongoDB 2.4.10,所以这不是一个选项。我将尝试生成一系列更新,例如:
例如对于“默认值”:{"1": {"2": "blah"}}
更新:
db.collection.update({"1": {$exists: false}}, {$set: {"1": {"2": "blah"}}})
db.collection.update({"1.2": {$exists: false}}, {$set: {"1.2": "blah"}})
还有其他选择吗?
“默认值”文档是 7KB 紧凑型 JSON,没有字符串值。 集合文档的平均大小为 10KB 的紧凑型 JSON。
如果 MongoDB-CSharp 驱动程序可以产生明显更快的解决方案,我可以使用它(我对此表示怀疑)。
【问题讨论】:
-
嗯,如果文档中不存在某个值,则计算结果为
null。因此,如果字段为null,您可以使用您的模型/DAO 返回默认值。将来更容易更改,存储到磁盘的不必要数据更少。 -
@MarkusWMahlberg:我正在通过生成的序列化程序存储 C# 结构。我想明确存储默认值(包括 C# 内联初始化程序和在构造函数中分配的值),除了 C#“本机”默认值(default(T)),以避免在初始化逻辑更改时意外隐式更改已保存的数据。此外,我不想将默认值与数据结构定义分开存储。
标签: mongodb