Сортировать по вложенному документу

Я пытаюсь отсортировать некоторые документы по дате внедренного документа. Мои документы выглядят так:

[
    {
        name: 'item1',
        slots: [
            {
                date : ISODate("2013-01-18T23:00:00Z")
            },
            {
                date : ISODate("2013-02-05T23:00:00Z")
            },
            {
                date : ISODate("2013-03-24T23:00:00Z")
            },
        ]
    },
    {
        name: 'item2',
        slots: [
            {
                date : ISODate("2013-01-12T23:00:00Z")
            },
            {
                date : ISODate("2013-01-03T23:00:00Z")
            },
            {
                date : ISODate("2013-03-04T23:00:00Z")
            },
        ]
    },
    {
        name: 'item3',
        slots: [
            {
                date : ISODate("2013-03-14T23:00:00Z")
            },
            {
                date : ISODate("2013-02-18T23:00:00Z")
            },
            {
                date : ISODate("2013-03-07T23:00:00Z")
            },
        ]
    }
]

Мне нужен результат, упорядоченный по возрастанию slots.date. Итак, результат должен выглядеть так:

[
    {
        name: 'item2',
        slots: [
            {
                date : ISODate("2013-01-03T23:00:00Z")
            },
            {
                date : ISODate("2013-01-12T23:00:00Z")
            },              
            {
                date : ISODate("2013-03-04T23:00:00Z")
            },
        ]
    },
    {
        name: 'item1',
        slots: [
            {
                date : ISODate("2013-01-18T23:00:00Z")
            },
            {
                date : ISODate("2013-02-05T23:00:00Z")
            },
            {
                date : ISODate("2013-03-24T23:00:00Z")
            },
        ]
    },      
    {
        name: 'item3',
        slots: [
            {
                date : ISODate("2013-02-18T23:00:00Z")
            },
            {
                date : ISODate("2013-03-07T23:00:00Z")
            },
            {
                date : ISODate("2013-03-14T23:00:00Z")
            }
        ]
    }
]

Первый элемент 2, поскольку он содержит самую раннюю дату slot.date (ISODate("2013-01-03T23:00:00Z")). Второй элемент1, потому что он содержит 2-ю самую раннюю дату (ISODate("2013-01-18T23:00:00Z")) и т. Д..... также можно сортировать даты во встроенном документе?

Что я пробовал:

.sort({{slots.date : 1}})

Но я получаю синтаксическую ошибку. Я использую MongoVUE для проверки запроса, может ли MongoVUE не выполнять сортировку по встроенным документам? Это даже возможно, что я хочу сделать?

1 ответ

Решение

Код, который вы показали:

.sort({{slots.date : 1}})

Имеет синтаксическую ошибку. В вашем коде есть две скобки, это должно быть:

.sort({slots.date : 1})

Также есть несколько способов сортировки ваших внутренних вложенных документов. Возможно, клиентская сторона является самым быстрым методом здесь, однако, вы также можете использовать структуру агрегации, если она доказывает, что делать это изначально в самой MongoDB быстрее:

db.col.aggregate([
    {$unwind: '$slots'},
    {$sort: {slots.date:1}},
    {$group: {_id: '$_id', slots: {$push: '$slots'}}
])

Нечто подобное отсортирует вложенные документы.

Другие вопросы по тегам