【发布时间】: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