Performance MongoDB数据模型优化
关于 我有由聚合框架处理的原始数据,后来的结果保存在另一个集合中。让我们假设聚合的结果如下:Performance MongoDB数据模型优化,performance,mongodb,optimization,data-modeling,Performance,Mongodb,Optimization,Data Modeling,关于 我有由聚合框架处理的原始数据,后来的结果保存在另一个集合中。让我们假设聚合的结果如下: cursor = { "result" : [ { "_id" : { "x" : 1, "version" : [ "2_0" ], "date" : { "year" : 2015, "
cursor = {
"result" : [
{
"_id" : {
"x" : 1,
"version" : [
"2_0"
],
"date" : {
"year" : 2015,
"month" : 3,
"day" : 26
}
},
"x" : 1,
"count" : 2
}
],
"ok" : 1
};
请注意,在大多数情况下,光标长度超过约2k个元素
所以,现在我循环思想游标(cursor.forEach)并执行以下步骤:
// Try to increment values:
var inc = db.runCommand({
findAndModify: my_coll,
query : {
"_id.x" : "1",
"value.2_0" : {
"$elemMatch" : {
"date" : ISODate("2015-12-18T00:00:00Z")
}
}
},
update : { $inc: {
"value.2_0.$.x" : 1
} }
});
// If there's no effected row via inc operation, - sub-element doesn't exists at all
// so let's push it
if (inc.value == null) {
date[date.key] = date.value;
var up = db.getCollection(my_coll).update(
{
"_id.x" : 1
},
{
$push : {}
},
{ writeConcern: { w: "majority", wtimeout: 5000 } }
);
// No document found for inserting sub element, let's create it
if (up.nMatched == 0) {
db.getCollection(my_coll).insert({
"_id" : {
"x" : 1
},
"value" : {}
});
}}
结果数据结构:
data = {
"_id" : {
"x" : 1,
"y" : 1
},
"value" : {
"2_0" : [
{
"date" : ISODate("2014-12-17T00:00:00.000Z"),
"x" : 1
},
{
"date" : ISODate("2014-12-18T00:00:00.000Z"),
"x" : 2
}
]
}
};
简言之,我必须应用这些操作来处理我的数据:
- 尝试增加值李>
- 若增量操作并没有影响数据,则将数据推送到数组
- 如果推送操作没有影响数据,则创建新文档
如何改进聚合数据插入?可能重复@Philipp,在我的情况下,如果它确实存在,我需要增加值,如果不存在,则创建新的值。在您提供的链接中,目标总是附加新元素。您使用的是哪个版本的MongoDB?它看起来像是2.6之前的版本,聚合管道返回游标,这就是为什么对聚合结果有16MB的限制。您是否并行处理聚合的结果?数据输入的速度有多快?如果您使用findAndModify检索文档,为什么不直接调用它,将其转换为最终形式,然后重新保存,而不是尝试多次更新?@wdberkeley,我使用的是2.6.3 MongoDB版本。“并行处理聚合”是什么意思?我使用cron初始化聚合和处理,它通过mongoshell执行.js文件。你能粘贴一个代码样本吗,关于FindModify?