我是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个单独的列中实现总电影、有发行日期的电影和没有发行日期的电影的输出,如下所示:
Total | Released | UnReleased
3 | 2 | 1
我能够编写单独的查询来执行计数,但我无法成功地将所有这些合并到一个查询中。最终目标是创建一个视图,生成这些计数作为输出。我尝试过使用诸如$and之类的运算符,但似乎不能像desired....this那样执行查询:
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" }
]
})
发布于 2018-08-30 22:44:55
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'
}
}
},
]
);
发布于 2018-08-30 11:49:12
您可以使用下面的聚合。
$gt > null
-检查聚合表达式中是否存在字段。
$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"]}}}
])
https://stackoverflow.com/questions/52088666
复制相似问题