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 :(得分: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: {} } ])