MongoDB对文档中数组的子元素进行排序

7

我的数据长这样:

{
    "name":"dan",
    "somestring":"asdf",
    "friends":[

            {
                "name": "carl",
                "height":180,
                ...
            },
            {
                "name": "john",
                "height":165,
                ...
            },
            {
                "name": "jim",
                "height":170,
                ...
            }

    ]
},
...

我想检索按身高降序排列的朋友名单文档。

我尝试了db.getCollection('users').find({"name" : "dan"}, {"friends" : 1}).sort({"friends.height" : -1}),但朋友列表仍保持不变。

编辑:我弄错了数据结构,已经将数组修复为正确格式...


1
这些是子文档对象的"键"。您无法对它们进行排序。如果您希望按"高度"排序,那么它们必须在"数组"条目本身中。 - Neil Lunn
祝你好运!大多数语言实现默认情况下都没有“排序键”。例如,JavaScript肯定没有。这实际上表明你选择的结构是不正确的。命名键基本上是一种“反模式”。至少在使用MongoDB进行查询时是不好的。 - Neil Lunn
我把结构搞砸了,需要编辑... - McDermott
@McDermott 另一个解决方案可以是“插入和排序”,基本上在插入步骤中,数组内部被排序。因此,当您进行Find()操作时,您将获取已经排序的结果。如果您对这种方法感兴趣,我会尝试安排一个答案。 - Daniele Tassone
@McDermott,我忘了提到“插入和排序”是MongoDB原生支持的。如果你有兴趣,就让我知道,我会写一个回复。 - Daniele Tassone
1个回答

13

一种选择是运行一个聚合,它:

  1. 展开数组
  2. friends.name排序
  3. 重新分组

管道应该看起来像这样:

db.collection.aggregate([
    { $match: { name: 'dan' }},
    { $unwind: '$friends' },
    { $sort: { 'friends.height': -1 }},
    { $group: { _id: '$name', friends: { $push: '$friends'}}])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接