Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance MongoDB数据模型优化_Performance_Mongodb_Optimization_Data Modeling - Fatal编程技术网

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
    }
]
}
};
简言之,我必须应用这些操作来处理我的数据:

  • 尝试增加值
  • 若增量操作并没有影响数据,则将数据推送到数组
  • 如果推送操作没有影响数据,则创建新文档
问题:

在某些情况下,聚合结果返回超过2k个结果,我必须应用前面提到的导致性能瓶颈的步骤。当我在处理已经聚合的数据时,-新数据会累积以进行聚合,之后我甚至无法将聚合应用到这个新的原始数据,因为它的大小超过了64MB的限制,这是由于firsts缓慢造成的

问题:

在增加x(请参见数据结构)值或添加子元素时,如何使用此数据结构提高性能

此外,由于使用位置参数的嵌套结构,我无法应用mongodb批量操作

可能选择的数据模型不正确?或者我根本没有正确地完成聚合任务?
如何改进聚合数据插入?

可能重复@Philipp,在我的情况下,如果它确实存在,我需要增加值,如果不存在,则创建新的值。在您提供的链接中,目标总是附加新元素。您使用的是哪个版本的MongoDB?它看起来像是2.6之前的版本,聚合管道返回游标,这就是为什么对聚合结果有16MB的限制。您是否并行处理聚合的结果?数据输入的速度有多快?如果您使用findAndModify检索文档,为什么不直接调用它,将其转换为最终形式,然后重新保存,而不是尝试多次更新?@wdberkeley,我使用的是2.6.3 MongoDB版本。“并行处理聚合”是什么意思?我使用cron初始化聚合和处理,它通过mongoshell执行.js文件。你能粘贴一个代码样本吗,关于FindModify?