MongoDB - Node.js - $或$ match聚合器上的操作返回"管道阶段规范对象必须只包含一个字段"

时间:2014-06-05 17:43:25

标签: node.js mongodb

我正在尝试使用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

我应该能够完成这样的事情。

2 个答案:

答案 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
    })