我有两个模式:order
和client
。 我想创建一个填充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 } ]
您应该在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);
}
}
您可以在这里测试它