Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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
Mongodb Mongo DBCollection的组函数在减少_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb Mongo DBCollection的组函数在减少

Mongodb Mongo DBCollection的组函数在减少,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个组函数调用,如下所示: coll.group( {"eventid":1}, {}, {participants:new Array(), winners:new Array()}, function(cur, result) { result.participants++; if (cur.status == "W"){result.winners++} }, false, f

我有一个组函数调用,如下所示:

coll.group(
    {"eventid":1}, 
    {},  
    {participants:new Array(), winners:new Array()},  
    function(cur, result) {  
        result.participants++; 
        if (cur.status == "W"){result.winners++} 
    }, 
    false, 
    function(err, data) {}
);
上面的方法非常有效,我可以得到每个“eventid”的参与者和获胜者的数量。然而,当我将代码更改为下面的位置,在这里我想要获得每个“eventid”的参与者姓名和获胜者姓名列表时,我没有得到想要的结果。每个列表都有来自每个eventid的条目。我如何解决这个问题?数组似乎可以跨多个键(eventid)重用,并且似乎不会为每个唯一键创建新的数组

coll.group(
    {"eventid":1}, 
    {},  
    {participants:new Array(), winners:new Array()},  
    function(cur, result) {  
        result.participants.push(cur.teamname); 
        if (cur.status == "W"){result.winners.push(cur.teamname)} 
    }, 
    false, 
    function(err, data) {}
);

最好的方法是根本不使用
.group()
,原因是它依赖于JavaScript处理来获得结果。因为它是通过解释器运行的,所以它的运行速度不如本机代码方法

使用本机方法,因此处理速度应该更快。您可以采取以下几种方法:

db.collection.aggregate([
//可能出现“错误”情况的组
{“$组”:{
“_id”:“$eventid”,
“参与者:{“$push”:“$teamname”},
“获胜者”:{
“$push”:{
“$cond”:[
{“$eq”:[“$status”,“W”]},
“$teamname”,
假的
]
}
}
}},
//展开一个数组
{“$REWIND”:“$Winners”},
//过滤掉“假”结果
{“$match”:{“Winners”:{“$ne”:false}},
//再次分组
{“$组”:{
“\u id”:“$\u id”,
“参与者”:{“$first”:“$PARAMENTS”},
“赢家”:{“$first”:“$Winners”}
}}
])
或在可能的情况下,通过MongoDB 2.6中的

db.collection.aggregate([
{“$组”:{
“_id”:“$eventid”,
“参与者:{“$push”:“$teamname”},
“获胜者”:{
“$push”:{
“$cond”:[
{“$eq”:[“$status”,“W”]},
“$teamname”,
假的
]
}
}
}},
{“$project”:{
“参与者”:1,
“获奖者”:{
“$setDifference”:[
“$Winners”,
[错误]
]
}
}}
])

无论如何都比JavaScript计算快,而且不受
.group()
的限制。

非常感谢!我试过你的setDifference代码。成功了!但我必须升级到2.6。我用的是2.0.4。这就是我坚持使用group的原因之一。@RamkumarManavalan在MongoDB 2.2发布之前,使用
.mapreduce()
方法来实现这一点。这里的控件比
.group()
多。但是这个版本确实已经过时了,所以升级和使用聚合框架是继续进行的方法。