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]);
_
上記の応答がない場合は、1つの手順で集約パイプラインを実行してみてください。
_db.audiofiles.aggregate([match]);
_
一致ステップの結果は次のステージにパイプ処理されるため、結果が得られない場合は、_$match
_パイプラインステップで一致するドキュメントが見つかりませんでした。一部のパラメーターを変更して、結果があるかどうかを確認します。
私も同じエラーに直面していました。私のコードは:
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: {} } ])