私はMongo Dbを初めて使用するので、このクエリについていくつかの助けをいただければ幸いです。私はここ数日間、ここの投稿をふるいにかけ、私のクエリに関連するものを見つけることができたが運が悪かったかどうかを確認するために髪を引き裂きました。
以下のような構造のドキュメントのコレクションがあります。
_id: xyz
Movieid: 123
MovieName: Titanic
ReleaseDate: 2000-01-01
_id: uvw
Movieid: 456
MovieName: Titanic II
ReleaseDate: 2018-01-01
_id: pqr
Movieid: 789
MovieName: Titanic III
ReleaseDate:
以下の3つの別々の列で、totalmovies、リリース日付きの映画、およびリリース日なしの映画のカウントとして出力を達成したいと思います。
Total | Released | UnReleased
3 | 2 | 1
個別のクエリを記述してカウントを実行することはできましたが、それらすべてを1つのクエリにうまく統合することはできません。最終目標は、これらのカウントを出力として生成する1つのビューを作成することです。 $ andなどの演算子を使用してみましたが、クエリが期待どおりに機能しないようです。これは私が得た限りです。
db.getCollection("Movies").aggregate({
"$and": [
{ "$match": { "ReleaseDate": { "$exists": true } }},
{ "$count": "Total" },
{ "$match": { "ReleaseDate": { "$exists": true, "$nin": [""] } }},
{ "$count": "Released" },
{ "$match": { "ReleaseDate": { "$exists": true, "$in": [""] } }},
{ "$count": "Unreleased" }
]
})
以下で試すことができます $facet
集約
$count
集計は常に単一の一致のみのカウントを提供します( $match
)条件。したがって、各カウントをさらに複数のセクションに分割する必要があります。それが $facet
プロセスは、同じ入力ドキュメントのセットの単一のステージ内に複数の集約パイプラインを提供します。
db.collection.aggregate([
{ "$facet": {
"Total": [
{ "$match" : { "ReleaseDate": { "$exists": true }}},
{ "$count": "Total" },
],
"Released": [
{ "$match" : {"ReleaseDate": { "$exists": true, "$nin": [""] }}},
{ "$count": "Released" }
],
"Unreleased": [
{ "$match" : {"ReleaseDate": { "$exists": true, "$in": [""] }}},
{ "$count": "Unreleased" }
]
}},
{ "$project": {
"Total": { "$arrayElemAt": ["$Total.Total", 0] },
"Released": { "$arrayElemAt": ["$Released.Released", 0] },
"Unreleased": { "$arrayElemAt": ["$Unreleased.Unreleased", 0] }
}}
])
[{
"Total": 3,
"Released": 2,
"Unreleased": 1
}]
以下の集計を使用できます。
$gt > null
-集計式にフィールドが存在するかどうかを確認します。
$cond
$sum
は、リリース日フィルターに基づいて0および1を出力します。
$add
リリース総数と未リリース総数の両方を出力合計に追加します。
db.Movies.aggregate([
{"$group":{
"_id":null,
"Unreleased":{"$sum":{"$cond":[{"$and":[{"$gt":["$ReleaseDate",null]},{"$ne":["$ReleaseDate",""]}]},0,1]}},
"Released":{"$sum":{"$cond":[{"$and":[{"$gt":["$ReleaseDate",null]},{"$ne":["$ReleaseDate",""]}]},1,0]}}
}},
{"$addFields":{"Total":{"$add":["$Unreleased","$Released"]}}}
])
db.Movies.aggregate(
// Pipeline
[
// Stage 1
{
$group: {
_id: null,
Total: {
$sum: 1
},
docs: {
$Push: '$$ROOT'
}
}
},
// Stage 2
{
$project: {
_id: 0,
Total: 1,
Released: {
$filter: {
input: "$docs",
as: "doc",
cond: {
$ne: ["$$doc.ReleaseDate", ""]
}
}
},
Unreleased: {
$filter: {
input: "$docs",
as: "doc",
cond: {
$eq: ["$$doc.ReleaseDate", ""]
}
}
},
}
},
// Stage 3
{
$project: {
Total: 1,
Released: {
$size: '$Released'
},
UnReleased: {
$size: '$Unreleased'
}
}
},
]
);