Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.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
Javascript mongodb:匹配数组中的元素并更新_Javascript_Mongodb_Aggregation Framework_Updates - Fatal编程技术网

Javascript mongodb:匹配数组中的元素并更新

Javascript mongodb:匹配数组中的元素并更新,javascript,mongodb,aggregation-framework,updates,Javascript,Mongodb,Aggregation Framework,Updates,基本上,我已经进行了聚合,以获得总数和组成总数的对象列表 现在,我必须为参与聚合的元素使用聚合对象id更新源表。基本上形成了双向关系 coll.aggregate([ {“$match”:{“elig”:1,“nid”:null,“cncl”:null}, {“$组”:{ “_id”:“$nkey”, “累计数量”:{“$sum”:“$pr_数量”}, “净额”:{“$push”:“$\u id”} }}, {“$project”:{ “nkey”:“$nkey”, “累计数量”:“$cumqt

基本上,我已经进行了聚合,以获得总数和组成总数的对象列表

现在,我必须为参与聚合的元素使用聚合对象id更新源表。基本上形成了双向关系

coll.aggregate([
{“$match”:{“elig”:1,“nid”:null,“cncl”:null},
{“$组”:{
“_id”:“$nkey”,
“累计数量”:{“$sum”:“$pr_数量”},
“净额”:{“$push”:“$\u id”}
}},
{“$project”:{
“nkey”:“$nkey”,
“累计数量”:“$cumqty”,
“净额”:“$净额”,
“\u id”:0
}},
{“$out”:aggcollnm}
])
现在,aggregated表具有由$push组成的obj ID列表

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

所以我做了下面的工作

coll.find().forEach(函数(elem){
coll.update(
{u id:elem.\u id},
{“$set”:{nid:aggcoll.aggregate([
{“$REWIND”:“$netted”},
{“$match”:{“netted”:elem._id},
{“$project”:{“\u id”:1}
])。_第一批[0]
}}
)
})
它在一个较小的组中运行良好。但对于100万个文档,由于以下错误而失败

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


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

您正在运行MongoDB 2.6,因此有一些方法可以更高效地进行更新,而您通常的处理过程似乎是相反的。您应该循环您的“aggcoll”,然后从中更新您的目标:

var batch=coll.initializeOrderedBulkOp();
计数器=0;
aggcoll.find().forEach(函数(agg){
batch.find({“\u id”:{“$in”:agg.netted}).update({“$set:{“nid”:agg.\u id}});
计数器++;
如果(计数器%1000==0){
batch.execute();
计数器=0;
batch=coll.initializeOrderedBulkOp();
}
});
如果(计数器>0)
batch.execute();
您的“内联”聚合语句不是一种非常有效的方式来执行您正在尝试的操作,并且会大大降低速度。在这里,不仅可以通过发布所有匹配的
\u id
值的更新,因为这是一个“多”更新操作,而且一般使用聚合语句还可以减少服务器的通信量和所花费的时间

实际上,我不知道你为什么要这么做,因为你应该已经有了“相关”信息。看看你原来的汇总:

{“$group”:{
“_id”:“$nkey”,
出于某种原因,您更改了此字段,使其在编写时不再是此新集合的
\u id
键。很明显,该字段存在于您来源的所有文档中,只应保留为新的主键