Сортировка документов по длине массива в Mongoose - PullRequest
1 голос
/ 13 июня 2019

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

const PostSchema = new Schema({

title:{type: String, required: true},
content:    {type: String, required: true },
tags:       [{type:String}],
author:     {type:mongoose.Schema.Types.ObjectId, ref:"User", required:true},
likes:      [{ type:mongoose.Schema.Types.ObjectId, ref:"User", required:false}],
createTime: {type:Date, default:Date.now}

})

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

// @route  GET api/posts

router.get('/',(req, res)=>{

  Post.aggregate([{ $addFields: {likesCount:{$size:"likes"}} }]);
  Post.find()
    .populate('author','name email')
    .sort({likesCount:1})
    .then(posts=> res.json(posts))
    .catch(err=>console.log(err))
  })

Я понятия не имею, как сделать это правильно.Пожалуйста, помогите.Заранее спасибо:)

1 Ответ

1 голос
/ 13 июня 2019

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

Post.aggregate([
  { "$lookup": {
    "from": Author.collection.name,
    "let": { "author": "$author" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": [ "$_id", "$$author" ] } } },
      { "$project": { "name": 1, "email": 1 }}
    ],
    "as": "author",
  }},
  { "$unwind": "$author" },
  { "$addFields": { "likesCount": { "$size": "$likes" }}},
  { "$sort": { "likesCount": 1 }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...