【问题标题】:MongoDB - Node.js -- $or operation on $match aggregator returning "A pipeline stage specification object must contain exactly one field"MongoDB - Node.js - $match 聚合器上的 $or 操作返回“管道阶段规范对象必须包含一个字段”
【发布时间】:2014-07-26 19:59:37
【问题描述】:

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

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

【问题讨论】:

  • 你用的是什么mongo客户端?
  • 我认为你只需要将 $match 用引号括起来,例如 "$match":
  • 我正在为 node.js 使用 mongodb 模块。
  • 将 $match 括在引号中返回相同的结果

标签: node.js mongodb


【解决方案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
})

统一更新: 您也可以将这些对象作为单独的参数传递。不需要将它们包装在数组中。再举一个例子:

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

【讨论】:

  • 谢谢!我最终不需要传递一个数组,我会发布我的答案。
  • 是的。也可以将这些对象作为单独的参数传递。不需要将它们包装在数组中。
【解决方案2】:

我的代码最终如下 - 出于某种原因,我不必传递数组。

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

【讨论】:

    猜你喜欢
    • 2017-07-03
    • 2020-02-04
    • 2017-09-20
    • 2016-12-27
    • 2013-12-08
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多