在我的 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' } } })
我面临的第一个问题是这仅返回
_id
和 alias
字段,但我需要所有这些字段...更新 :
我更改了一些示例数据以更好地反射(reflect)我的用例,因为@user3100115 答案解决了旧示例数据的问题,但不能解决真实数据的问题。
我所做的改变:
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/