聚合管道抛出错误“管道阶段规范对象必须只包含一个字段”。

时间:2017-04-24 09:11:22

标签: mongodb mongodb-query aggregation-framework database

db.audiofiles.aggregate({
    $match: {
        privacy: { $ne: "same" },
        date: { "$eq": "2017/04/25" },
        deleted: 0
    },
    $group: { "_id": "$to_email" }
});

我使用了$match但仍显示管道错误,如下所示。

assert: command failed: {
    "ok" : 0,
    "errmsg" : "A pipeline stage specification object must contain exactly one field.",
    "code" : 16435
} : aggregate failed

2 个答案:

答案 0 :(得分:12)

您需要将管道阶段放在array中,即文档按顺序通过各个阶段。

db.collection.aggregate( [ { <stage> }, ... ] )

$group 管道步骤操作符应位于其自己的对象/文档中,而不是 $match 管道步骤的一部分。你聚合管道应该是

db.audiofiles.aggregate([
    /* match pipeline */
    {
        "$match": {
            "privacy": { "$ne": "same" },
            "date": { "$eq": "2017/04/25" },
            "deleted": 0
        }
    },
    /* group pipeline */
    {
        "$group": { 
            "_id": "$to_email", 
            "count": { "$sum": 1 }
        }
    }
]);

或者将管道步骤创建为可以推送到数组的对象变量,该数组成为用作 aggregate() 方法参数的管道:

/* match pipeline */
var match = {
    $match: {
        privacy: { $ne: "same" },
        date: { "$eq": "2017/04/25" },
        deleted: 0
    }
},
/* group pipeline */
group = {
    $group: { 
        "_id": "$to_email", 
        "count": { "$sum": 1 }
    }
};

db.audiofiles.aggregate([match, group]);

如果您没有从上面得到任何回复,那么只需一步就可以尝试运行聚合管道:

db.audiofiles.aggregate([match]);

匹配步骤的结果将通过管道传输到下一个阶段,因此,如果您未获得任何结果,则表示尚未找到 $match 管道步骤任何匹配的文件。更改一些参数以查看是否有任何结果。

答案 1 :(得分:0)

我也遇到了同样的错误。 我的代码是:

 db.getCollection('users').aggregate([
      {
          "$lookup":
          {     
              from: 'songs',
              localField: '_id',
              foreignField: 'artistId',              
              as: 'abc'              
          },
          "$project":
          {
              "name":1,
              "status":1,
              "abc":{"artistId":1, "name":1}
          }
      }
])

我通过添加{}来解决。

db.getCollection('users').aggregate([
      {
          "$lookup":
          {     
              from: 'songs',
              localField: '_id',
              foreignField: 'artistId',              
              as: 'abc'              
          }
      }, // added braces
      { 
          "$project":
          {
              "name":1,
              "status":1,
              "abc":{"artistId":1, "name":1}
          }
      } // added braces
])
  

注意::确保$ lookup和$ project应该放在不同的{}中,例如:

db.getCollection('users').aggregate([ { $lookup:{} }, { $project: {} } ])
  

我的代码是:

 db.getCollection('users').aggregate([ { $lookup:{},  $project: {} } ])