Подтвердить что ты не робот

Сортировка MongoDB

Я хочу реализовать функцию "bump" для тем. После того, как тема затронута, у нее появится новое поле "bump_date". Я хочу отсортировать его так, что когда будет поле "bump_date", оно будет отсортировано так, как если бы это было "созданное" поле. Вот пример моих db.topics:

{
    "text" : "test 1",
    "created" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)"
},
{
    "text" : "test 2",
    "created" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)"
},
{
    "text" : "test 3",
    "created" : "Sun Nov 17 2011 02:03:28 GMT-0800 (PST)",
    "bump_date: : "Sun Nov 19 2011 02:03:28 GMT-0800 (PST)"
}

Я хочу, чтобы сортировка возвращалась в порядке "тест 1", "тест 3", "тест 2"

4b9b3361

Ответ 1

Сортировка в MongoDB выполняется следующим образом:

db.collection.find({ ... spec ... }).sort({ key: 1 })

где 1 возрастает, а -1 убывает.

В вашем конкретном примере: db.topics.find().sort({ bump_date: 1 }), хотя было бы лучше назвать его чем-то вроде "updated_at".

Вы также обязательно захотите поместить индекс в поле "bump_date".

Ответ 2

Как предложил Брайан Хикс, создание дополнительного поля updated_at - это путь. Таким образом, когда документ создается, вы можете иметь created_at и updated_at изначально одинаковыми.

{
     "created_at": xxx,
     "updated_at": xxx
}

Если вы затем "набросите" поле updated_at, установив его на текущее время, когда есть событие bump, вы можете сортировать поле updated_at для достижения желаемого заказа.

Ответ 3

также:

db.collection.find( { $query: {}, $orderby: { column : -1 } } )

где 1 возрастает и -1 убывает.

Ответ 4

В настоящее время в mongodb невозможно выполнить сортировку на основе пользовательских критериев по нескольким столбцам. здесь функция должна была возвращать bump_date, если она установлена, else return created

Либо вам придется использовать серверный или клиентский код, как указано здесь:

Сортировка Mongo complex?

или если вы хотите остаться с основным запросом и сортировкой, вы должны:

  • создайте ключ bump_date, эквивалентный created всякий раз, когда создается новая запись. Это означает, что не будет накладными данными, так как вы можете ожидать, что каждая ваша тема будет наноситься время от времени в будущем, поэтому в конечном итоге будет добавлено поле bump_date. Поэтому добавьте его с самого начала.

  • Всякий раз, когда статья нажимается, обновите поле bump_date.

Ваши примерные документы будут выглядеть следующим образом:

{
    "text" : "test 1",
    "created" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)",
    "bump_date" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)"
},
{
    "text" : "test 2",
    "created" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)",
    "bump_date" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)" 
},
{
    "text" : "test 3",
    "created" : "Sun Nov 17 2011 02:03:28 GMT-0800 (PST)",
    "bump_date: : "Sun Nov 19 2011 02:03:28 GMT-0800 (PST)"
}

Вы должны ensureIndex в поле bump_date. Теперь вы можете легко запросить требуемые данные.

db.topics.find().sort({ bump_date: 1 })