提问者:小点点

Mongoose find()。populate()。sort()在5.9.9版本中不起作用


我有两个模式:orderclient。 我想创建一个填充client并按company排序,但排序不起作用。 我为什么会有这个问题,怎么解决? 谢谢

客户

const mongoose = require('mongoose')

const ClientSchema = mongoose.Schema({
  name: {
    type: String,
    require: true,
    trim: true
  },
  surname: {
    type: String,
    require: true,
    trim: true
  },
  company: {
    type: String,
    require: true,
    trim: true
  },
  email: {
    type: String,
    require: true,
    trim: true,
    unique: true
  },
  phone: {
    type: String,
    trim: true
  },
  date_creation: {
    type: Date,
    default: Date.now()
  },
  salesman: {
    type: mongoose.Schema.Types.ObjectId, 
    require: true,
    ref: 'User'
  }
})
module.exports = mongoose.model('Client', ClientSchema)

订单

const mongoose = require('mongoose')

const OrderSchema = mongoose.Schema({
  order: {
    type: Array,
    require: true,
  },
  total: {
    type: Number,
    require: true,
  },
  client: {
    type: mongoose.Schema.Types.ObjectId, 
    require: true,
    ref: 'Client'
  },
  salesman: {
    type: mongoose.Schema.Types.ObjectId, 
    require: true,
    ref: 'User'
  },
  stage: {
    type: String,
    default: "PENDENT"
  },
  date_creation: {
    type: Date,
    default: Date.now()
  },
})
module.exports = mongoose.model('Order', OrderSchema)

解析器

getOrdersBySalesman: async (_, { }, ctx) => {
      try {
        const orders = await Order.find({ salesman: ctx.user.id }).populate('client').sort({company: 1})
        return orders
      } catch (error) {
        console.log(error);
      }
    },

输出

[ { order: [ [Object] ],
    stage: 'PENDENT',
    date_creation: 2020-06-10T12:57:35.179Z,
    _id: 5ee0da703b683e071c0adfe2,
    total: 6166.65,
    client:
     { date_creation: 2020-04-28T08:07:12.338Z,
       _id: 5ea813b3085b4417b8627557,
       name: 'nou client2',
       surname: 'NOU2',
       company: 'NN',
       email: 'nou2@mail.com',
       phone: '222222222',
       salesman: 5ea568905d47ed2760e8d11c,
       __v: 0 },
    salesman: 5ea568905d47ed2760e8d11c,
    __v: 0 },
  { order: [ [Object] ],
    stage: 'PENDENT',
    date_creation: 2020-06-10T13:12:59.653Z,
    _id: 5ee0dc6d8d0a2f137c2c403d,
    total: 900,
    client:
     { date_creation: 2020-04-27T15:51:03.693Z,
       _id: 5ea710d2c2ba712118bf1feb,
       name: 'nou client6',
       surname: 'NOU6',
       company: 'EE',
       email: 'nou6@mail.com',
       phone: '66666666',
       salesman: 5ea568905d47ed2760e8d11c,
       __v: 0 },
    salesman: 5ea568905d47ed2760e8d11c,
    __v: 0 },
  { order: [ [Object] ],
    stage: 'PENDENT',
    date_creation: 2020-06-10T13:31:04.285Z,
    _id: 5ee0e103c3eb2b0ab4c6799e,
    total: 100,
    client:
     { date_creation: 2020-06-10T13:31:04.284Z,
       _id: 5ee0e0eec3eb2b0ab4c6799d,
       name: 'Pere',
       surname: 'Peret',
       company: 'AA',
       email: 'pp@mail.com',
       phone: '',
       salesman: 5ea568905d47ed2760e8d11c,
       __v: 0 },
    salesman: 5ea568905d47ed2760e8d11c,
    __v: 0 },
  { order: [ [Object] ],
    stage: 'PENDENT',
    date_creation: 2020-06-10T13:31:04.285Z,
    _id: 5ee0e19dc3eb2b0ab4c679a0,
    total: 900,
    client:
     { date_creation: 2020-06-10T13:31:04.284Z,
       _id: 5ee0e164c3eb2b0ab4c6799f,
       name: 'Jose',
       surname: 'Jose',
       company: 'JJ',
       email: 'jj@mail.com',
       phone: '',
       salesman: 5ea568905d47ed2760e8d11c,
       __v: 0 },
    salesman: 5ea568905d47ed2760e8d11c,
    __v: 0 } ]


共1个答案

匿名用户

您应该在populate阶段进行排序,检查文档

您的函数可能如下所示

getOrdersBySalesman: async (_, { }, ctx) => {
  try {
    const orders = await Order.find({ salesman: ctx.user.id }).populate({
      path: 'client',
      options: { sort: { 'company': 1 } }
    });

    return orders;

  } catch (error) {
    console.log(error);
  }
}

希望有帮助

Update:您可以使用聚合管道对带有填充字段的文档进行排序

如下所示

getOrdersBySalesman: async (_, { }, ctx) => {
  try {
    const orders = await Order.aggregate([
      {
        $match: { salesman: mongoose.schema.Types.ObjectId(ctx.user.id) } // this should be of type objectId to do the match
      },
      {
        $lookup: {
          localField: "client",
          foreignField: "_id",
          from: "Client", // this is the name of the clients model
          as: "client"
        }
      },
      {
        $unwind: '$client' // the client is an array of only one element, so unwind it to convert it to an object
      },
      {
        $sort: { 'client.company': 1 }
      }
    ]);

    return orders;

  } catch (error) {
    console.log(error);
  }
}

您可以在这里测试它