mongodb / мангуст - сортировка по двум полям

1

У меня есть два поля:

  • дата (ISODate)
  • value (это number - однако также может быть undefined)

Я хочу сортировать их определенным образом.

Во-первых - сортировка по value. Если он существует (не undefined), пусть они на первом месте. Если value не определено, нажмите эти объекты в конце.

Во-вторых - сортировать по date. Итак, в этот момент у нас будет все, что сортируется по value. Но теперь я хочу сортировать его по date.

Ожидаемый результат:

[
   {
      value: 1, 
      date: today, // ofc it a date but just to represent the case
   }, 
   {
      value: 2,
      date: yesterday,
   },
   {
      value: undefined,
      date: today,
   },
   {
      value: undefined,
      date: yesterday,
   }
]

Текущее решение:

.sort({
  value: -1,
  date: -1
});

Однако в некоторых ситуациях это терпит неудачу, к сожалению, Im не может определить, почему он иногда сортирует его неправильно. Но это так...

заранее спасибо

  • 1
    Сказать «в некоторых отношениях это терпит неудачу» является расплывчатым и бесполезным. Каково ожидаемое поведение и что вы видите вместо этого? Пожалуйста, опишите и приведите простой пример.
Теги:
arrays
mongoose

1 ответ

2

Для этого вы можете использовать aggregate с $cond.

db.getCollection('collectionName').aggregate([
{
   $project :
       {
           "id" : 1,
           "value" : 1,
           "date": 1,
           sortValue: {
            $cond: {
              if: { $eq: ['$value',undefined ]},
              then: 0, 
              else: 1,
            },
          }
       }
},
{
   $sort :
       {
           "sortValue" :-1,
           "value" : 1,
           "date" : -1
       }
}])

Протестировано в Mongo GUI.

Совокупность в Mongoose:

Model.aggregate([
  {
    $project:
    {
      "id": 1,
      "value": 1,
      "date": 1,
      sortValue: {
        $cond: {
          if: { $eq: ['$value', undefined] },
          then: 0,
          else: 1,
        },
      }
    }
  },
  {
    $sort:
    {
      "sortValue": -1,
      "value": 1,
      "date": -1
    }
  }
], function (err, result) {
  if (err) {
    console.log(err);
    return;
  }
  console.log(result);
});
  • 0
    Как использовать это с мангустом?
  • 0
    Пожалуйста, проверьте мой обновленный ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню