#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. Я также уже потратил часы, проклиная документацию, вы не одиноки 😉