5

我看到很多对“我如何获得一个字段中的所有唯一值?”这个问题的回答。这建议了该.distinct()方法。但这会返回这些值的简单数组。如何检索具有字段唯一值的所有文档?

[{age: 21, name: 'bob'}, {age: 21, name: 'sally'}, {age: 30, name: 'Jim'}] 
Query for unique age -->
[{age: 21, name: 'sally'}, {age: 30, name: 'Jim'}]
or
[{age: 21, name: 'bob'}, {age: 30, name: 'Jim'}]

事后过滤查询并不是一个理想的解决方案,因为我仍然想像往常一样选择、$limit 和 $skip。

4

2 回答 2

4
> db.foo.insert([{age: 21, name: 'bob'}, {age: 21, name: 'sally'}, {age: 30, name: 'Jim'}])
> db.foo.count()
3
> db.foo.aggregate({ $group: { _id: '$age', name: { $max: '$name' } } }).result
[
    {
        "_id" : 30,
        "name" : "Jim"
    },
    {
        "_id" : 21,
        "name" : "sally"
    }
]
于 2013-02-05T00:00:41.300 回答
1

嗨,我是新手 mongo 开发人员,我一直在努力解决同样的问题,我终于能够找到解决方案。我正在使用具有以下步骤的聚合管道:

  1. 组:与_id作为age
  2. 查找:从步骤 1 开始使用。在具有本地字段和外部字段_id的同一集合中,将查找保存到新列表。_idageob
  3. 替换根:即。将到目前为止的每个结果的根替换为ob步骤 2 中列表中的第一个对象。

那里可能有更好的解决方案。如果有人发现它,请告诉我们。希望解决方案有所帮助。

D B:

[
  {
    age: 21,
    name: "bob"
  },
  {
    age: 21,
    name: "sally"
  },
  {
    age: 30,
    name: "Jim"
  }
]

聚合:

db.collection.aggregate([
  {
    $group: {
      _id: "$age"
    }
  },
  {
    $lookup: {
      from: "collection",
      localField: "_id",
      foreignField: "age",
      as: "ob"
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $first: "$ob"
      }
    }
  }
])

输出:

[
  {
    "_id": ObjectId("5a934e000102030405000002"),
    "age": 30,
    "name": "Jim"
  },
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "age": 21,
    "name": "bob"
  }
]

mongoplayground:

游乐场解决方案

于 2021-09-14T05:28:34.930 回答