带有字段
field1
、field2
、field3
等字段的文档集合,我需要找到
field3
field3
的每个不同值,需要获取 field3
对于#1,我可以做
db.myCollection.distinct("field3")
我该如何进行#2?
样品采集:
[
{ "field1": 11, "field2": "toyota", "field3": "camry" },
{ "field1": 22, "field2": "toyota", "field3": "corolla" },
{ "field1": 33, "field2": "toyota", "field3": "camry" },
{ "field1": 44, "field2": "honda", "field3": "accord" },
{ "field1": 55, "field2": "honda", "field3": "accord" },
{ "field1": 66, "field2": "honda", "field3": "city" }
]
想要的结果:
[
{ "field1": 11, "field2": "toyota", "field3": "camry" },
{ "field1": 22, "field2": "toyota", "field3": "corolla" },
{ "field1": 44, "field2": "honda", "field3": "accord" },
{ "field1": 66, "field2": "honda", "field3": "city" }
]
您需要运行一个聚合操作,按
field3
对所有文档进行分组,并使用 $first
累加器和 $$ROOT
系统变量来获取第一个文档,如下所示:
db.myCollection.aggregate([
{
"$group": {
"_id": "$field3",
"doc": { "$first": "$$ROOT" }
}
}
])
或者精确的输出:
db.myCollection.aggregate([
{
"$group": {
"_id": "$field3",
"field1": { "$first": "$field1" },
"field2": { "$first": "$field2" }
}
},
{
"$project": {
"_id": 0,
"field3": "$_id",
"field2": 1,
"field1": 1
}
}
])
使用 $group 聚合运算符根据字段的不同值对记录进行聚合
根据上述描述,请尝试在 MongoDB shell 中执行以下查询
db.myCollection.aggregate(
// Pipeline
[
// Stage 1
{
$group: {
_id:{field3:'$field3'},
data:{$first:'$$ROOT'}
}
}
]
);
在上面提到的每个组的第一个文档中的查询数据是通过使用$first聚合运算符获取的,$$ROOT指的是当前正在通过聚合操作处理的文档
chridam 答案是正确的,但如果您不想手动写入所有字段,您可以尝试此操作。
db.myCollection.aggregate([
{
$group: {
"_id": "$field3",
"data": { "$first": "$$ROOT" }
}
},
{
$replaceRoot: { newRoot: "$data" }
}
])