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
最佳答案
您需要将管道阶段放置在 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
管道步骤未找到任何匹配的文档。改一些参数看看有没有结果。
关于mongodb - 聚合管道抛出错误 "A pipeline stage specification object must contain exactly one field.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43584023/