MongoDB сортировка по ключу / значению вложенного документа - PullRequest
0 голосов
/ 17 ноября 2018

Итак, у меня есть динамическая коллекция с именем data с такими документами:

[
    {
        _id: 1,
        module_id: 5,
        dynamic_fields: [
            {key: "title", value: "title 1"},
            {key: "rate", value: 3},
            {key: "category", value: 12},
            {key: "body", value: "my content goes here 1"},
        ]
    },
    {
        _id: 2,
        module_id: 5,
        dynamic_fields: [
            {key: "title", value: "title 2"},
            {key: "rate", value: 5},
            {key: "category", value: 12},
            {key: "body", value: "my content goes here 2"},
        ]
    },
    {
        _id: 3,
        module_id: 5,
        dynamic_fields: [
            {key: "title", value: "title 3"},
            {key: "rate", value: 2},
            {key: "category", value: 12},
            {key: "body", value: "my content goes here 3"},
        ]
    }
]

Вопрос:

Как получить все документы с помощью dynamic_fields[key:category]=12 и отсортировать их?на rate стоимость его поддокумента.

Спасибо.

1 Ответ

0 голосов
/ 17 ноября 2018

Давайте попробуем.

  1. mongodb-runner start ( полезный инструмент! )
  2. mongo
  3. получить некоторые данные испытаний:

    db.test.insertMany([
     {
         _id: 1,
         module_id: 5,
         dynamic_fields: [
             {key: "title", value: "title 1"},
             {key: "rate", value: 3},
             {key: "category", value: 12},
             {key: "body", value: "my content goes here 1"},
         ]
     },
     {
         _id: 2,
         module_id: 5,
         dynamic_fields: [
             {key: "title", value: "title 2"},
             {key: "rate", value: 5},
             {key: "category", value: 12},
             {key: "body", value: "my content goes here 2"},
         ]
     },
     {
         _id: 3,
         module_id: 5,
         dynamic_fields: [
             {key: "title", value: "title 3"},
             {key: "rate", value: 2},
             {key: "category", value: 12},
             {key: "body", value: "my content goes here 3"},
         ]
     }
    ])
    

Теперь у нас есть тестовые данные (обратите внимание, что я сделал массив dynamic_fields, чтобы при вставке не было ошибок).

Нам нужно сделать это поэтапно в агрегации. Если вы хотите увидеть, что происходит, вы можете запустить это, начиная только с этапа $match, а затем добавляя каждый этап, чтобы увидеть, как преобразуется конвейер.

db.test.aggregate(
    { $match: { "dynamic_fields.key": "category", "dynamic_fields.value": 12} },
    // add a field that we can sort on.
    { $addFields: {
        "order": {
            $filter: {
              "input": "$dynamic_fields",
              "as": "d",
              "cond": { "$eq": [ "$$d.key", "rate" ] }
            }
        }
    }},
    // order is an array of one, so we unwind it so we have an object that 
    // we can sort on.
    { $unwind: "$order"},
    { $sort: {
        'order.value': 1 }
    }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...