MongoDB 按公共字段聚合组结果查询
MongoDB Aggregate Group Results Query by Common Fields
想弄清楚如何通过查询对 Mongo 文档执行特定分组,而不是在获取数据后通过代码转换结果。
示例模拟数据:
[
{ 'id': 1, 'status': 'EMPTY', 'name': 'ALBERT' },
{ 'id': 2, 'status': 'EMPTY', 'name': 'ERIC' },
{ 'id': 3, 'status': 'EMPTY', 'name': 'ALBERT' },
{ 'id': 4, 'status': 'EMPTY', 'name': 'ALBERT' },
{ 'id': 5, 'status': 'EMPTY', 'name': 'JESSICA' },
{ 'id': 6, 'status': 'EMPTY', 'name': 'ERIC' },
...
]
我的聚合查询:
db.results.aggregate([
{
$match: {
'status': 'EMPTY'
}
},
???
])
我想transform/sort将结果转换成这样的对象:
{
'ALBERT': [
{ 'id': 1, 'status': 'EMPTY', 'name': 'ALBERT' },
{ 'id': 3, 'status': 'EMPTY', 'name': 'ALBERT' },
{ 'id': 4, 'status': 'EMPTY', 'name': 'ALBERT' },
],
'ERIC': [
{ 'id': 2, 'status': 'EMPTY', 'name': 'ERIC' },
{ 'id': 6, 'status': 'EMPTY', 'name': 'ERIC' }
],
'JESSICA': [
{ 'id': 5, 'status': 'EMPTY', 'name': 'JESSICA' }
]
}
在线查看文档有点困难,因为我什至不确定这种类型的转换叫什么,或者我应该在 Mongo 中使用什么聚合器。因此,任何指向正确方向的观点都将不胜感激!
谢谢!!
试试这个:
db.collection.aggregate([
{ $unset: "_id" },
{
$group: {
_id: "$name",
data: { $push: "$$ROOT" }
}
},
{
$project: {
data: {
k: "$_id",
v: "$data"
}
}
},
{ $replaceRoot: { newRoot: { $arrayToObject: "$data" } } },
{
$group: {
_id: null,
data: { $push: "$$ROOT" }
}
},
{ $replaceRoot: { newRoot: { $mergeObjects: "$data" } } }
])
想弄清楚如何通过查询对 Mongo 文档执行特定分组,而不是在获取数据后通过代码转换结果。
示例模拟数据:
[
{ 'id': 1, 'status': 'EMPTY', 'name': 'ALBERT' },
{ 'id': 2, 'status': 'EMPTY', 'name': 'ERIC' },
{ 'id': 3, 'status': 'EMPTY', 'name': 'ALBERT' },
{ 'id': 4, 'status': 'EMPTY', 'name': 'ALBERT' },
{ 'id': 5, 'status': 'EMPTY', 'name': 'JESSICA' },
{ 'id': 6, 'status': 'EMPTY', 'name': 'ERIC' },
...
]
我的聚合查询:
db.results.aggregate([
{
$match: {
'status': 'EMPTY'
}
},
???
])
我想transform/sort将结果转换成这样的对象:
{
'ALBERT': [
{ 'id': 1, 'status': 'EMPTY', 'name': 'ALBERT' },
{ 'id': 3, 'status': 'EMPTY', 'name': 'ALBERT' },
{ 'id': 4, 'status': 'EMPTY', 'name': 'ALBERT' },
],
'ERIC': [
{ 'id': 2, 'status': 'EMPTY', 'name': 'ERIC' },
{ 'id': 6, 'status': 'EMPTY', 'name': 'ERIC' }
],
'JESSICA': [
{ 'id': 5, 'status': 'EMPTY', 'name': 'JESSICA' }
]
}
在线查看文档有点困难,因为我什至不确定这种类型的转换叫什么,或者我应该在 Mongo 中使用什么聚合器。因此,任何指向正确方向的观点都将不胜感激!
谢谢!!
试试这个:
db.collection.aggregate([
{ $unset: "_id" },
{
$group: {
_id: "$name",
data: { $push: "$$ROOT" }
}
},
{
$project: {
data: {
k: "$_id",
v: "$data"
}
}
},
{ $replaceRoot: { newRoot: { $arrayToObject: "$data" } } },
{
$group: {
_id: null,
data: { $push: "$$ROOT" }
}
},
{ $replaceRoot: { newRoot: { $mergeObjects: "$data" } } }
])