mongodb - 如何使用 MongoDB 聚合来获取每个组的第一个,包括空值?

标签 mongodb aggregation-framework

在我的 MongoDB people 集合中,我需要过滤具有相同“别名”属性值的人员,保留其中的第一个,并保留所有人员的“别名”为空。

一些样本人员数据:

{ "_id" : "1", "flag" : true,  "name" : "Alice",    "alias" : null },
{ "_id" : "2", "flag" : true,  "name" : "Bob",      "alias" : "afa776bea788cf4c" },
{ "_id" : "3", "flag" : true,  "name" : "Bobby",    "alias" : "afa776bea788cf4c" },
{ "_id" : "4", "flag" : true,  "name" : "Cristina", "alias" : null },
{ "_id" : "5", "flag" : false, "name" : "Diego",    "alias" : null },
{ "_id" : "6", "flag" : true,  "name" : "Zoe",      "alias" : "2211293acc82329a" },

这是我期望的结果:
{ "_id" : "1", "name" : "Alice",    "alias" : null },
{ "_id" : "2", "name" : "Bob",      "alias" : "afa776bea788cf4c" },
{ "_id" : "4", "name" : "Cristina", "alias" : null },
{ "_id" : "6", "name" : "Zoe",      "alias" : "2211293acc82329a" },

我带来了这个初始查询:
db.people.aggregate({ $group: { _id: '$alias', alias: { $first: '$alias' } } })

我面临的第一个问题是这仅返回 _idalias 字段,但我需要所有这些字段...

更新 :
我更改了一些示例数据以更好地反射(reflect)我的用例,因为@user3100115 答案解决了旧示例数据的问题,但不能解决真实数据的问题。

我所做的改变:
  • 再添加一个具有空别名的文档(“Cristina”)(我的文档都有“别名”字段),因为我需要 返回所有具有空别名值的 文档,而不仅仅是第一个。
  • 再添加一个 bool 属性(“标志”),我也需要能够匹配...即:使用 find() 我会做: db-people.find({flag:true}) ,但我不明白如何使用 aggregate() 过滤更多字段...

  • 请告诉我您是否认为我最好提出一个新问题...

    最佳答案

    您可以使用 $first 返回 _id 阶段中的 $group 值。

    db.people.aggregate([ 
        { '$match': { 'flag': true } }, 
        { '$project': {
            'name': 1,          
            'alias': { 
                '$cond': [
                    { '$eq': [ '$alias', null ] }, 
                    '$_id', 
                    '$alias' 
                ]
            }
        }},
        { '$group': {
            '_id': '$alias',         
            'name':  { '$first': '$name' },          
            'id': { '$first': '$_id' }       
        }}, 
        { '$project': {
            'alias': {
                '$cond': [ 
                    { '$eq': [ '$id', '$_id' ] }, 
                    null, 
                   '$_id' 
                ]
            }, 
            'name': 1,
            '_id': '$id'
        }}
    ])
    

    返回:

    { "_id" : "6", "name" : "Zoe", "alias" : "2211293acc82329a" }
    { "_id" : "4", "name" : "Cristina", "alias" : null }
    { "_id" : "2", "name" : "Bob", "alias" : "afa776bea788cf4c" }
    { "_id" : "1", "name" : "Alice", "alias" : null }
    

    关于mongodb - 如何使用 MongoDB 聚合来获取每个组的第一个,包括空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34375163/

    相关文章:

    javascript - MongoDB 查询的可选参数

    node.js - Mongoose/mongodb - 只获取每个 id 的最新记录

    javascript - 文档和子文档的 $sum 按 "$author"(MongoDB)

    node.js - 统计 Mongo 中引用对象的数量

    mongodb - 按多个字段和子字段过滤 Mongo 项目

    mongodb - mongocli 是否支持 Apple M1 芯片的公式 URL?

    node.js - 文档插入中调用函数

    每日分组内的 MongoDB 聚合

    mongodb - 如何在 MongoDB 中进行嵌套 $lookup 搜索?

    mongodb - 嵌入文档的聚合平均值