Проект, а затем сортировка в мангусте по полям массива

#javascript #arrays #mongodb #mongoose #nosql

#язык JavaScript #массивы #mongodb #мангуст #nosql

Вопрос:

У меня есть модель мангуста для публикации на веб-сайте, похожем на социальные сети, под названием PostModel:

 { caption: String, likes: [] // array to store info about users who liked the video, basically a ref to a different model comments: [] // array to store comment objects }  

Я хочу отсортировать все видео в запросе поиска на основе количества лайков, которое здесь будет длиной массива «лайки». Если два поста имеют одинаковое количество лайков, я хочу отсортировать их по количеству комментариев или иным образом по длине массива «комментарии».

Проблема в том, что это не работает. Это то, что я пытался:

 PostModel.find({}, {  likes: { $size: "$likes" },  comments: { $size: "$comments" } },  {  sort: { likes: -1, comments: -1 } // gives "cannot sort with keys that are parallel arrays" error })  

Это наводит меня на мысль, что сортировка происходит до проекции. Чтобы подтвердить, я попытался выполнить следующий запрос:

 PostModel.find({}, {  _l: { $size: "$likes" },  _c: { $size: "$comments" } },  {  sort: { _l: -1, _c: -1 } })  

Этот запрос не дал никаких ошибок, но вообще не отсортировал результирующий массив. Итак, подтверждено, что проекция действительно происходит после сортировки в мангусте.

Как в этом случае я должен отсортировать результирующий массив по количеству лайков и количеству комментариев?

Ответ №1:

Я опробовал эту агрегацию, и она отлично работает для меня с вашими данными:

 PostModel.aggregate([  {  '$set': {  'likes': {  '$size': '$likes'  },   'comments': {  '$size': '$comments'  }  }  }, {  '$sort': {  'likes': -1,   'comments': -1  }  } ])  

Я построил эту агрегацию с помощью программы Mongo compass, которая позволяет вам видеть работу ваших агрегаций в реальном времени, создавая ее шаг за шагом.

Комментарии:

1. Может быть, также проверьте свои версии, может быть, это не поддерживает то, что вы пытаетесь сделать прямо сейчас, и

2. Я не знаю почему, но по какой-то причине это работает с методом aggregate (). Я попробовал ваше решение, и оно сработало для меня. Честно говоря, это очень странно. Я не смог найти разницы между find() и aggregate в документах мангуста, которые, честно говоря, с самого начала не очень информативны.

3. Я также уже потратил часы, проклиная документацию, вы не одиноки 😉