Как отсортировать коллекцию MongoDB в зависимости от того, существует поле или нет - PullRequest
1 голос
/ 13 марта 2020

В моем приложении есть конечная точка, которая должна находить всех пользователей, которые удовлетворяют некоторым условиям, а затем возвращать результаты в виде массива. Результат отсортирован по дате создания. Теперь мне нужно выполнить более сложную сортировку.

1) Вернуть пользователей, которые сначала загрузили свою фотографию профиля (это главное условие, которое я должен добавить) 2) Кроме того, результаты должны быть отсортированы по дате создания но пользователи с загруженным аватаром всегда должны быть первыми (хотя они и создали учетную запись позже)

Вот мой код:

router.get('/users/:page?', ({ params, query }, response) => {
    let { page = 1 } = params;
    page = _.parseInt(page);
    let { limit = 50 } = query;
    limit = _.parseInt(limit);
    const skip = page * limit - limit;

    User.find({ name: { $exists: true }})
        .limit(limit)
        .skip(skip)
        .sort({ created: 1 })
        .exec((error, users) => {
            if (error) {
                return response.status(500).send('users-couldnt-be-found');
            }

            response.status(200).send(users);
        });
});

Мой пример json коллекция:

[
    { name: 'Jon without avatar', created: '2020-01-28T22:29:48.603Z' }
    { name: 'Jon with avatar', avatar: '/path/to/file', created: '2020-01-28T22:29:48.603Z' }
]

Я пытался использовать aggregate и group, но я не совсем понимаю, как это работает. Буду благодарен за любую помощь.

Ответы [ 2 ]

3 голосов
/ 13 марта 2020

Вы можете использовать агрегационный конвейер.

[
{$project: {
  _id: 1,
  created: 1,
  avatar: 1,
  avatarExists: {
    $cond: [
      {$ifNull: ["$avatar", false]},
      1,
      0
    ]
  }
}}, 
{$sort: {
  avatarExists: -1,
  created: 1
}}]

Этап $ project добавляет новое поле, указывающее, существует ли аватар. Этап сортировки $ сортируется сначала при наличии аватара, а затем по дате создания.

0 голосов
/ 13 марта 2020

в своем роде вы можете определить, как они должны быть отсортированы по ... вам просто нужно расширить то, что у вас есть.

.sort({ created: 1, hasAvatar: -1 })

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