Mongodb: сортировка документов по объектам массива - PullRequest
18 голосов
/ 15 марта 2011

Я хотел бы вернуть документы в отсортированном порядке, в котором содержится самое низкое значение foo.bar (которые являются объектами массива).

Я могу сделать db.collection.find().sort({foo.0.bar: 1}), но это соответствует только первому элементу в массиве - и, как вы можете видеть в приведенном ниже примере, сначала будет отсортирована позиция 1 (foo.0.bar = 5), где яЯ хочу вернуть элемент 2 сначала (foo.2.bar = 4), так как он имеет объект с наименьшим значением.

{
    "name": "Item 1",
    "foo": [
        {
            "bar": 5
        },
        {
            "bar": 6
        },
        {
            "bar": 7
        }
    ]
}
{
    "name": "item 2",
    "foo": [
        {
            "bar": 6
        },
        {
            "bar": 5
        },
        {
            "bar": 4
        }
    ]
}

Ответы [ 4 ]

19 голосов
/ 19 января 2012

Кажется, Монго может сделать это.

Например, если у меня есть следующие документы:

{ a:{ b:[ {c:1}, {c:5 } ] } }
{ a:{ b:[ {c:0}, {c:12} ] } }
{ a:{ b:[ {c:4}, {c:3 } ] } }
{ a:{ b:[ {c:1}, {c:9 } ] } }

И выполнить следующее:

db.collection.find({}).sort({ "a.b.c":1 });
// produces:
{ a:{ b:[ {c:0}, {c:12} ] } }
{ a:{ b:[ {c:1}, {c:5 } ] } }
{ a:{ b:[ {c:1}, {c:9 } ] } }
{ a:{ b:[ {c:4}, {c:3 } ] } }

db.collection.find({}).sort({ "a.b.c":-1 });
// produces:
{ a:{ b:[ {c:0}, {c:12} ] } }
{ a:{ b:[ {c:1}, {c:9 } ] } }
{ a:{ b:[ {c:1}, {c:5 } ] } }
{ a:{ b:[ {c:4}, {c:3 } ] } }

Как видите, сортировка по {"a.b.c":1} принимает мин всех значений в массиве и сортирует по ним, тогда как сортировка по {"a.b.c":-1} принимает макс. всех значений.

4 голосов
/ 20 ноября 2012

Вы можете сделать такую ​​сортировку с помощью команды агрегата из версии 2.2 Монго:

    db.collection.aggregate([{$unwind: "$foo"},
    {$project: {bars:"$foo.bar"}},
    {$group: {_id:"$_id",min:{$min: "$bars"}}},
    {$sort: {min:1}}])
4 голосов
/ 15 марта 2011

Альтернативой использованию map / lower является сохранение значения min из массива в виде отдельного поля в документе, который затем можно было бы заказать.Когда вы добавляете в массив, вы также обновляете это поле, если новое значение ниже, чем текущий записанный минимум.

например, ваш первый документ станет таким (примечание «добавлен минбар»):

{
    "name": "Item 1",
    "minbar" : 5,
    "foo": [
        {
            "bar": 5,
        }
        {
            "bar": 6,
        }
        {
            "bar": 7,
        }
    ]
}
0 голосов
/ 15 марта 2011

Нет прямого способа сделать это в монго.Вам нужно будет использовать map / проводить для извлечения минимального значения в каждом массиве, а затем сортировать по этому минимальному значению

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