【问题标题】:Sort and add sequence number to nested items in mongodb排序并将序列号添加到mongodb中的嵌套项
【发布时间】:2020-08-03 10:18:49
【问题描述】:

我有以下文档的 MongoDB 集合:

{
    "name": "First parent",
    "items": [
        { "name": "First child", "value": 32 },
        { "name": "Second child", "value": 76 },
        { "name": "Third child", "value": 13 }
    ]
}
{
    "name": "Second parent",
    "items": [
        { "name": "Fifth child", "value": 16 },
        { "name": "Sixth child", "value": 15 }
    ]
}
{
    "name": "Third parent",
    "items": [
        { "name": "Fourth child", "value": 56 }
    ]
}

我想:

  • 从 (desc) 的每个父级中按 items.value 对子级进行排序,
  • items.value 的第一个(最高)孩子(desc)对父母进行排序,
  • 为每个孩子添加items.order

所以期望的输出应该是:

{
    "name": "First parent",
    "items": [
        { "name": "Second child", "value": 76, "order": 1 }, // Should be first in array, because 76 < 32 < 13. Should have order: 1, because 76 is highest value of all children in collection.
        { "name": "First child", "value": 32, "order": 3 },
        { "name": "Third child", "value": 13, "order": 6 }
    ]
}
{
    "name": "Third parent",
    "items": [
        { "name": "Fourth child", "value": 56, "order": 2 } // Should have order: 2, because 56 is second highest value of all children in collection.
    ]
}
{
    "name": "Second parent",
    "items": [
        { "name": "Fifth child", "value": 16, "order": 4 },
        { "name": "Sixth child", "value": 15, "order": 5 }
    ]
}

有没有办法做到这一点?我只有这个(没有items.order 属性):

db.collection.aggregate([
    { "$unwind": "$items" },
    { "$sort": { "items.value": -1 } },
    { "$group": {
        "_id": "$_id",
        "name": { "$first": "$name" },
        "items": { "$push": "$items" }}
    },
    { "$sort": { "items.value": -1 } }
])

【问题讨论】:

    标签: mongodb sorting


    【解决方案1】:

    引入一个key来获取item数组的第一个元素的第一个值。然后按它排序。

    [
      {
        "$unwind": {
          path: "$items"
        }
      },
      {
        "$sort": {
          "items.value": -1
        }
      },
      {
        "$group": {
          "_id": "$_id",
          "name": {
            "$first": "$name"
          },
          topValue: {
            $first: "$items.value"
          },
          "items": {
            "$push": "$items"
          }
        }
      },
      {
        "$sort": {
          "topValue": -1
        }
      },
      {
        "$project": {
          topValue: 0
        }
      }
    ]
    

    工作Mongo playground

    【讨论】:

    • 谢谢,但是我的数据库中没有items.order,所以我需要在查询时创建它。
    • 没问题。
    • 如果您的回答对您有帮助,请勾选并投票以帮助寻求此类问题的人
    猜你喜欢
    • 2020-11-28
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 2015-02-07
    • 2022-01-20
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多