мангуста заселить сортировку _ Mongoose Node.js - PullRequest
2 голосов
/ 27 апреля 2019

У меня есть две схемы, которые представляют мои документы поста и категории. Я пытаюсь отсортировать свои сообщения с помощью свойства category.order. Свойство order является числовым полем.

const postSchema = mongoose.Schema({
    title: {
        type: String,
        max: 200,
    },
    body: {
        type: String,
        max: 10000,
    },
    categories: {
        type: mongoose.Schema.ObjectId,
        ref: 'Category',
        required: true
    }
})
module.exports = mongoose.model('Post', postSchema);


const categorySchema = mongoose.Schema({
    name: {
        type: String,
        max: 30,
        required:true
    },
    order: {
        type: Number,
        unique: true
    },
})
module.exports = mongoose.model('Category', categorySchema);

Я знаю, что сортировка работает только с числовыми полями. Я много искал о проблеме симуляции в сети и в StackOverflow, даже в документации mongoose. Но мой запрос не работает. он возвращает мой пост, но порядок сортировки не работает. запрос:

Post.find({}).populate({path:'categories', select:'order', options:{sort:{order:1}}})

1 Ответ

2 голосов
/ 27 апреля 2019

Хорошо заполнить не sort корневые / внешние документы. Опции передаются в populate только sorts внутренних ссылочных документах. Вы должны использовать aggregation здесь, чтобы выполнить сортировку по родительским документам, и это то, что $lookup может лучше выполнять по сравнению с populate запросами.

Post.aggregate([
  { '$lookup': {
    'from': 'categories',
    'let': { 'categories': '$categories' },
    'pipeline': [
      { '$match': { '$expr': { '$eq': ['$_id', '$$categories'] }}},
      { '$project': { 'order': 1 }}
    ],
    'as': 'categories'
  }},
  { '$unwind': '$categories' },
  { '$sort': { 'categories.order': 1 }}
])
...