MongoDB сортировка - PullRequest
       1

MongoDB сортировка

32 голосов
/ 21 ноября 2011

Я хочу реализовать функцию «поднять» для тем.Как только тема поднимется, у нее появится новое поле "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)"
}

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

Ответы [ 4 ]

78 голосов
/ 21 ноября 2011

Сортировка в MongoDB производится так:

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

, где 1 - восходящий, а -1 - нисходящий.

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

Вы также определенно захотите поместить индекс в поле «bump_date».

5 голосов
/ 06 июня 2015

Также:

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

, где 1 - восходящий, а -1 - нисходящий.

5 голосов
/ 21 ноября 2011

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

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

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

3 голосов
/ 21 ноября 2011

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

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

Монго комплексная сортировка?

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

  • создает ключ 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 })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...