Сортировка и добавление порядкового номера к вложенным элементам в mongodb - PullRequest
0 голосов
/ 03 августа 2020

У меня есть коллекция 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 }
    ]
}

Я хотел бы:

  • Сортировать детей по items.value в каждом родительском элементе из (des c) ,
  • Сортировать родителей по items.value первого (старшего) дочернего элемента (des c),
  • Добавить 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 } }
])

1 Ответ

1 голос
/ 03 августа 2020

Введите ключ для получения первого значения первого элемента массива элементов. Затем отсортируйте по нему.

[
  {
    "$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
    }
  }
]

Рабочий Пн go Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...