我正在尝试使用Node.js的本机mongodb驱动程序执行以下操作:
db.collection('myColec').aggregate([
{
$match:{
/*$or:[{name:"adam"},{channel:"steve"}]*/
'name': {$in: ['adam','steve']}
},
$group: {
//_id: "$notes",
_id: {channel: "$name",name:"$age"},
earnings: {$sum: "$earnings"},
years: {$sum: "$years"},
years: {$sum: "$years"}
}
}],
function(err,res){
if(err){console.log(err)}
//do something
}
根据此文件: http://docs.mongodb.org/manual/reference/operator/aggregation/match/#pipe._S_match
我应该能够完成这样的事情。
答案 0 :(得分:1)
您应该传递对象数组。那里的每个对象都描述了一个操作($ match,$ group等)。但是只传递一个对象的数组。此对象包含多个字段。这是不正确的。
所以尝试编写这样的查询:
db.collection('myColec').aggregate(
[{
$match:
/*$or:[{name:"adam"},{channel:"steve"}]*/
'name': {$in: ['adam','steve']}
},
{
$group: {
//_id: "$notes",
_id: {channel: "$name",name:"$age"},
earnings: {$sum: "$earnings"},
years: {$sum: "$years"},
years: {$sum: "$years"}
}],
function(err,res){
if(err){console.log(err)}
//do something
})
<强> UPD:强> 您也可以将这些对象作为单独的参数传递。不需要将它们包装在数组中。还有一个例子:
db.collection('myColec').aggregate(
{
$match:
/*$or:[{name:"adam"},{channel:"steve"}]*/
'name': {$in: ['adam','steve']}
},
{
$group: {
//_id: "$notes",
_id: {channel: "$name",name:"$age"},
earnings: {$sum: "$earnings"},
years: {$sum: "$years"},
years: {$sum: "$years"}
},
function(err,res){
if(err){console.log(err)}
//do something
})
查看文档。它非常有用并且包含很多示例:docs
答案 1 :(得分:0)
我的代码最终是下面的 - 由于某种原因我没有传递数组。
db.collection('myColec').aggregate(
{$match:{'name':{$in:['adam','steve']}}},
{$group: {
_id: {age:"$age"},
earnings: {$sum: "$earnings"},
views: {$sum: "$years"},
adViews: {$sum: "$years"}
}
}, function(err,res){
//do something
})