MongoDB-Node.js--$or对$match聚合器的操作返回;管道阶段规范对象必须仅包含一个字段;
我正在尝试使用Node.js的本机mongodb驱动器执行以下操作:MongoDB-Node.js--$or对$match聚合器的操作返回;管道阶段规范对象必须仅包含一个字段;,node.js,mongodb,Node.js,Mongodb,我正在尝试使用Node.js的本机mongodb驱动器执行以下操作: db.collection('myColec').aggregate([ { $match:{ /*$or:[{name:"adam"},{channel:"steve"}]*/ 'name': {$in: ['adam','steve']} }, $grou
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
}
根据本文件:
我应该能够完成这样的事情 您应该传递对象数组。那里的每个对象描述一个操作($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
})
查看文档。它非常有用,并包含许多示例:我的代码如下所示-出于某种原因,我不必传递数组
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
})
您使用的mongo客户端是什么?我想您只需要将$match用引号括起来,如“$match”:我正在使用node.js的mongodb模块。将$match用引号括起来会返回相同的结果谢谢!我最终不需要通过数组,我将发布我的答案。是的。也可以将这些对象作为单独的参数传递。不需要将它们包装在数组中。