MongoDB:如何获得不同的子文档字段值列表?

vla*_*mir 29 distinct mongodb nosql

假设我收集了以下文件:

{
   "family": "Smith",
   "children": [
        {
            "child_name": "John"
        },
        {
            "child_name": "Anna"
        },
    ]
}

{
   "family": "Williams",
   "children": [
        {
            "child_name": "Anna"
        },
        {
            "child_name": "Kevin"
        },
    ]
}
Run Code Online (Sandbox Code Playgroud)

现在我想以某种方式获得以下列出的所有系列的唯一子名称:

[ "John", "Anna", "Kevin" ]
Run Code Online (Sandbox Code Playgroud)

结果的结构可能不同.如何在MongoDB中实现这一目标?应该是简单的事情,但我无法弄清楚.我在集合上尝试了aggregate()函数,但后来我不知道如何应用distinct()函数.

Asy*_*sky 52

你可以这样做:

db.collection.distinct("children.child_name");
Run Code Online (Sandbox Code Playgroud)

在你的情况下,它返回:

[ "John", "Anna", "Kevin" ]
Run Code Online (Sandbox Code Playgroud)

  • 该死的,这么容易!我开了个头脑.谢谢这是最短的工作答案,给我我想要的. (2认同)
  • 好的 - 但是在分片群集上的性能呢?例如,每个rs实例将处理distinct;) (2认同)

Vla*_*lov 6

使用帮助聚合框架:

db.collection.aggregate([{$unwind:'$children'}, {$group:{_id:'$children.child_name'}}])
Run Code Online (Sandbox Code Playgroud)

或更多的兴趣;)频率名称:

db.collection.aggregate([{$unwind:'$children'}, {$group:{_id:'$children.child_name', freq:{$sum:1}}}])
Run Code Online (Sandbox Code Playgroud)

  • 如果你想使用聚合框架,为什么不做{$ group:{_ id:1,children:{$ addToSet:"$ children.child_name"}}}呢?这会在"children"字段中为您提供一个带有名称数组的结果. (6认同)