node.js - Mongoose,根据外键/填充键排序

标签 node.js mongodb mongoose

我有两个带有 Mongoose 的架构(AgendaCompromissoSchemaprofissionaisSchema)。

我想找到一组按 profissional.name 降序排序的所有 AgendaCompromisso

我更喜欢单独的架构而不是嵌套文档。

我尝试了下一个代码,但没有成功。

    router.get('/',function(req,res,next){  
        AgendaCompromisso.find({})
        .populate('profissional',name') //here I´d like the results sorted by 'name' descending
        .sort:{
           'profissional.name': -1 //Sort by name Added DESC
         }        
         .exec( (err,data) => {
           callback(err,data,res)
        })
    });

//路由器

const express = require('express');
const router = express.Router();
const AgendaCompromisso = require('../models/agendaCompromisso');
const callback=function(err,data,res){
     //console.log(data);
     if (err) return res.status(500).json(err);
     return res.status(200).send(data);
}   

//get all
router.get('/',function(req,res,next){  
    AgendaCompromisso.find({})
    .populate('profissional','name')
    .exec( (err,data) => {
       callback(err,data,res)
    })
});

//架构

var AgendaCompromissoSchema = new mongoose.Schema({
  profissional:{type:mongoose.Schema.Types.ObjectId, ref:'Profissional'},
  title:{type:String},
  slot_dateInit:{type: Date},
  slot_timeInit:{type: Date}
});
module.exports = mongoose.model('AgendaCompromisso',  AgendaCompromissoSchema,'agendasCompromissos' );

var profissionaisSchema = new mongoose.Schema({
  name: {type: String, unique:true},
  cpf: {type: String},
});

module.exports = mongoose.model('Profissional', profissionaisSchema,'profissionais' );

最佳答案

使用$lookup (执行左外连接,类似于sql)在聚合管道中可以解决这个问题:

router.get('/',function(req,res,next){  
    AgendaCompromisso.aggregate([
    {
        $lookup:
        {
            from: "profissionais", //use the name of database collection not mongoose model
            localField: "profissional",
            foreignField: "_id",
            as: "profissional_doc"
        }
    },

    {
        $unwind: "$profissional_doc"  //remove array
    },

    {
        $sort: {"profissional_doc": -1}  // or {"profissional_doc": 1} for ascending
    }
    ])
    .exec( (err,data) => {
        callback(err,data,res)
    })
});

请注意,要进行查找,您需要 mongodb 版本 3.2 或更高版本。

关于node.js - Mongoose,根据外键/填充键排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44331221/

相关文章:

Java 不会读取 Node.js 服务器

node.js - 我怎样才能让 ejs 与 mongoose 一起工作?

node.js - MongoDB Aggregate 中的 Mongoose Virtuals

node.js - 如何使用 Fixie Socks(Heroku 附加组件)通过 mongoose 连接到 mongodb

node.js - 如何检查 mongodb 中是否已创建模式?

javascript - 由路由器中的 html webpack 插件生成的渲染文件

node.js - .npmignore - 忽略所有 *.ts 文件但不包括 *.d.ts

node.js - 处理来自 Promise.all 的一系列 Promise

javascript - Mongoose "find"返回一个空数组

javascript - 多个帐户的嵌套关联