【问题标题】:mongodb sorting children of an array in a document [duplicate]mongodb对文档中数组的子项进行排序[重复]
【发布时间】:2017-06-28 08:21:12
【问题描述】:

我的数据如下所示:

{
    "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}),但好友列表保持不变。

编辑:我弄乱了数据的结构,我将数组固定为看起来像一个数组...

【问题讨论】:

  • 这些是子文档对象的“键”。您无法对它们进行排序。如果您希望按“高度”排序,那么它们需要自己在“数组”条目中。
  • 祝你好运!无论如何,大多数语言实现“默认”都没有“排序键”。例如,JavaScript 肯定不会。这确实表明您选择的结构不正确。命名键基本上是一种“蚂蚁模式”。至少用 MongoDB 查询肯定不好。
  • 我搞砸了结构,正在编辑...
  • @McDermott 另一种解决方案可以是“插入和排序”,基本上里面的数组是在插入步骤中排序的。因此,当您进行 Find() 时,您将获取已排序的结果。如果您对这种方法感兴趣,我会尝试安排答案。
  • @McDermott 我忘了提到“插入和排序”是 MongoDB 本机支持的。如果你有兴趣,请告诉我,我会写回复。

标签: arrays mongodb sorting children


【解决方案1】:

一个选项是运行一个聚合:

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

管道应该如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    相关资源
    最近更新 更多