查找一个字段的每个不同值的第一个文档

问题描述 投票:0回答:3

带有字段

field1
field2
field3
等字段的文档集合,我需要找到

  1. field3
  2. 的不同值
  3. 对于
    field3
    的每个不同值,需要获取
    field3
  4. 中每个不同值的第一个文档

对于#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" }
]
mongodb mongodb-query aggregation-framework
3个回答
7
投票

您需要运行一个聚合操作,按

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
        }
    }
])

2
投票

使用 $group 聚合运算符根据字段的不同值对记录进行聚合

根据上述描述,请尝试在 MongoDB shell 中执行以下查询

db.myCollection.aggregate(

  // Pipeline
  [
    // Stage 1
    {
      $group: {
        _id:{field3:'$field3'},
        data:{$first:'$$ROOT'}
      }
    }

  ]


);

在上面提到的每个组的第一个文档中的查询数据是通过使用$first聚合运算符获取的,$$ROOT指的是当前正在通过聚合操作处理的文档


0
投票

chridam 答案是正确的,但如果您不想手动写入所有字段,您可以尝试此操作。

db.myCollection.aggregate([
    {
        $group: {
            "_id": "$field3",
            "data": { "$first": "$$ROOT" }
        }
    },
    {   
        $replaceRoot: { newRoot: "$data" } 
    }
])
© www.soinside.com 2019 - 2024. All rights reserved.