2017-04-24 56 views
1
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 
+0

流水线是一个数组。在括号之间添加方括号。 –

+0

db.audiofiles.aggregate({[$ match:{privacy:{$ ne:“same”},date:{“$ eq”:“2017/04/25”},deleted:0]},$ group: { “_id”: “$ to_email”}); 得到错误 - > 2017-04-24T14:46:37.021 + 0530 E QUERY [thread1] SyntaxError:missing]在计算属性名称@(shell):1:32 – Jagadeesh

回答

3

您需要将流水线阶段放置在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流水线步骤未找到任何匹配的文档。更改一些参数以查看是否有任何结果。

+0

我没有得到任何响应输入上述查询在我的mongo终端? – Jagadeesh

+0

然后它意味着你的'$ match'管道没有返回任何匹配,或者你正在错误的集合上运行集合操作。用'$ match'管道来尝试不同的参数以进行调试,或者使用'$ group'步骤来运行管道,并查看它是否返回任何文档。 – chridam

+0

audiofiles.aggregate({$ group:{“_ id”:“$ to_email”}}); 如果我输入上述查询,我​​从我的收藏中获取记录。 audiofiles.find({privacy:{$ ne:“same”},date:{“$ eq”:“24/04/2017”} ,删除:0}})。 如果我键入上面的查询,我得到一组响应.. – Jagadeesh

相关问题