首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >mongodb中单次查询的多个计数

mongodb中单次查询的多个计数
EN

Stack Overflow用户
提问于 2018-08-30 11:03:02
回答 2查看 14.1K关注 0票数 27

我是Mongo Db的新手,希望能对这个问题有所帮助。在过去的几天里,我一直在筛选这里的帖子,撕裂我的头发,看看是否能找到任何与我的查询相关的东西,但没有运气。

我有一个结构类似于下面的文档的集合:

代码语言:javascript
复制
_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个单独的列中实现总电影、有发行日期的电影和没有发行日期的电影的输出,如下所示:

代码语言:javascript
复制
Total   |   Released  |     UnReleased
 3      |       2     |          1

我能够编写单独的查询来执行计数,但我无法成功地将所有这些合并到一个查询中。最终目标是创建一个视图,生成这些计数作为输出。我尝试过使用诸如$and之类的运算符,但似乎不能像desired....this那样执行查询:

代码语言:javascript
复制
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" }
  ]
})
EN

回答 2

Stack Overflow用户

发布于 2018-08-30 22:44:55

代码语言:javascript
复制
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'
                }
            }
        },

    ]



);
票数 3
EN

Stack Overflow用户

发布于 2018-08-30 11:49:12

您可以使用下面的聚合。

$gt > null -检查聚合表达式中是否存在字段。

基于发布日期过滤器,使用$sum输出0和1的$cond

$add将已释放和未释放计数都添加到输出总数中。

代码语言:javascript
复制
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"]}}}
])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52088666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档