【问题标题】:mongodb: matching an element in an array and updatingmongodb:匹配数组中的元素并更新
【发布时间】:2014-06-30 09:03:45
【问题描述】:

基本上,我已经完成了聚合以获取总数和构成总数的对象列表。

现在,我必须使用聚合对象 ID 更新源表,以获取有助于聚合的元素。基本上形成两种方式的关系。

coll.aggregate([
    { "$match": {"elig": 1, "nid" : null, "cncl" : null  } },
    { "$group": {
        "_id": "$nkey",
        "cumqty": {"$sum": "$pr_qty.qty" },
        "netted" : { "$push" : "$_id" } 
    }},
    { "$project": {
        "nkey":"$nkey" ,
        "cumqty": "$cumqty",
        "netted" : "$netted" ,
        "_id" : 0 
    }},
    { "$out": aggcollnm }
])

现在,聚合表具有由 $push 形成的 obj id 列表。

说,doc1、doc2和doc3组成了agg1,而agg1的列表中有doc1、doc2和doc3。我希望 doc1、doc2 和 doc3 将 agg1 的 id 设为 nettid。

所以我做了以下

coll.find().forEach( function(elem) {
    coll.update (
        { "_id" : elem._id },
        { "$set" : { nid : aggcoll.aggregate ( [
            { "$unwind" : "$netted" } ,
            { "$match" : { "netted" : elem._id } },
            { "$project" : { "_id" :1 } }
            ] )._firstBatch[0]
        }}
    )
})

它在较小的集合中运行良好。但是对于 1M 文档失败并出现以下错误。

2014-06-30T09:48:40.577+0100 错误:getMore:服务器上不存在游标,可能重新启动或超时?在 src/mongo/shell/query.js:116 加载失败:./netting.js

有没有更好的方法来做到这一点。

【问题讨论】:

    标签: javascript mongodb aggregation-framework updates


    【解决方案1】:

    您正在运行 MongoDB 2.6,因此有一些方法可以更有效地更新,并且您的一般处理似乎是相反的。你应该循环你的“aggcoll”,然后从里面更新你的目标:

    var batch = coll.initializeOrderedBulkOp();
    counter = 0;
    
    aggcoll.find().forEach(function(agg) {
        batch.find({ "_id": { "$in": agg.netted }}).update({ "$set: { "nid": agg._id } });
        counter++;
    
        if ( counter % 1000 == 0 ) {
            batch.execute();
            counter = 0;
            batch = coll.initializeOrderedBulkOp();
        }
    });
    
    if ( counter > 0 )
        batch.execute();
    

    您的“内联”聚合语句不是一种非常有效的方式来执行您正在尝试的操作,并且会大大减慢速度。在这里,不仅通过$in 对所有匹配的_id 值发布更新,因为这是一个“多”更新操作,而且bulk operations API 的一般使用减少了到服务器的流量和所花费的时间。

    真的,我完全不知道您为什么要这样做,因为您应该已经拥有“相关”信息。看看你的原始聚合:

    { "$group": {
        "_id": "$nkey",
    

    由于某种原因,您更改了它,以便在您写出它时它不再是这个新集合的_id 键。显然,该字段存在于您从中获取的所有文档中,并且应该将其保留为新的主键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-04
      • 2021-04-16
      • 1970-01-01
      • 2011-12-19
      • 2015-06-21
      • 1970-01-01
      • 2013-09-07
      • 2016-03-26
      相关资源
      最近更新 更多