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

MongoDB:如何获得子文档字段值的不同列表?,mongodb,distinct,nosql,Mongodb,Distinct,Nosql,假设我收集了以下文件: { "family": "Smith", "children": [ { "child_name": "John" }, { "child_name": "Anna" }, ] } { "family": "Williams", "children": [ { "child_name":

假设我收集了以下文件:

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

{
   "family": "Williams",
   "children": [
        {
            "child_name": "Anna"
        },
        {
            "child_name": "Kevin"
        },
    ]
}
现在,我想以某种方式获得以下所有族中唯一的子名称列表:

[ "John", "Anna", "Kevin" ]

结果的结构可能不同。如何在MongoDB中实现这一点?应该很简单,但我搞不懂。我在集合上尝试了aggregate()函数,但不知道如何应用distinct()函数。

使用帮助聚合框架:

db.collection.aggregate([{$unwind:'$children'}, {$group:{_id:'$children.child_name'}}])
或更多兴趣;)姓名频率:

db.collection.aggregate([{$unwind:'$children'}, {$group:{_id:'$children.child_name', freq:{$sum:1}}}])
您只需执行以下操作:

db.collection.distinct("children.child_name");
在您的情况下,它返回:

[ "John", "Anna", "Kevin" ]

但这不是他想要的-他想要不同的名称数组,而不是每个名称及其计数的子文档…我读到:>“结果的结构可能不同。”是的!,这是另一种结构;)是的,谢谢。它可以工作,并迫使我进一步了解aggregate()聚合框架是强大的工具;)在这种情况下,您可以计算一些有关名称的统计信息如果您想使用聚合框架,为什么不直接执行{$group:{{{u id:1,children:{$addToSet:“$children.children_name”}}呢?这将返回一个结果,其中包含“children”字段中的名称数组。该死,太简单了!我把头撞碎了。谢谢,这是最短的工作答案,给了我我想要的。好的,但是分片集群的性能呢?将在每个rs实例上处理distinct(例如;)显然,我还没有考虑到表现。但这很重要,谢谢。如果你有一个分片集群,那么你在整个数据集中所做的一切都将在每个分片上处理,然后由mongos合并。这就是切分的工作原理。请注意,“distinct”将尽可能使用索引。这对于本论坛来说是一个太开放的问题。我建议问一下谷歌集团mongodb用户。