在mongodb中使用单个查询的多个计数

Asd*_*d J 8 mongodb mongodb-query aggregation-framework

我是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: 
Run Code Online (Sandbox Code Playgroud)

我希望在3个单独的列中实现输出作为总电影,具有发布日期的电影和没有发布日期的电影的计数,如下所示:

Total   |   Released  |     UnReleased
 3      |       2     |          1
Run Code Online (Sandbox Code Playgroud)

我能够编写单独的查询来执行计数,但我无法将所有这些成功整合到单个查询中.最终目标是创建一个视图,将这些计数作为输出.我已经尝试使用$和等运算符,但似乎无法使查询按预期工作....这是我得到的:

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"
        }


    ]
);
Run Code Online (Sandbox Code Playgroud)

Ash*_*shh 23

您可以尝试以下$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] }
  }}
])
Run Code Online (Sandbox Code Playgroud)

输出继电器

[{
    "Total": 3,
    "Released": 2,
    "Unreleased": 1
}]
Run Code Online (Sandbox Code Playgroud)

  • @LiorMagen回答第一个问题...如果您看到了,我已经在输出中发布了链接。您可以删除`$ project`并[参见](https://mongoplayground.net/p/Ry0OU5JW83i)发生的情况。$ facet将为您提供每个管道计数的嵌套字段。对于第二个问题,我将编辑答案。 (2认同)