【发布时间】:2026-02-07 23:35:02
【问题描述】:
我似乎无法对这个 mongo/mongoose 查询进行排序。第一个返回准确的结果,只是没有按相反的方向排序。
const UserSchema = new Schema({
username : String,
current : { type: Schema.Types.ObjectId, ref: 'News' },
friends : [{ user: { type: Schema.Types.ObjectId, ref: 'User'}, status: String }],
profile : {...}
})
const NewsSchema = new Schema({
user : { type: Schema.Types.ObjectId, ref: 'User' },
owner : { type: Schema.Types.ObjectId, ref: 'User' },
date : Date,
desc : String
});
const News = mongoose.model('News', NewsSchema);
const User = mongoose.model('User', UserSchema);
我试过了
.populate({
path: 'friends.user',
model: 'User',
select: 'profile.firstname profile.lastname profile.avatar username current -_id',
populate: {
path: 'current',
model: 'News',
select: 'date owner desc',
populate: {
path: 'owner',
model: 'User',
select: 'profile.firstname profile.lastname profile.avatar username'
},
},
})
.sort({'current.date': -1})
还有
.populate({
path: 'friends.user',
model: 'User',
select: 'profile.firstname profile.lastname profile.avatar username current -_id',
populate: {
path: 'current',
model: 'News',
select: 'date owner desc',
options: { sort: { date: -1 } }
},
})
这个会出错
User.findOne({ _id: req.userId }, 'friends -_id')
.populate({
path: 'friends.user',
model: 'User',
select: 'profile.firstname profile.lastname profile.avatar username current -_id',
populate: {
path: 'current',
model: 'News',
select: 'date owner desc',
},
options: {
sort: { date: -1 }
}
})
{
"message": "MongooseError: Cannot populate with `sort` on path friends.user because it is a subproperty of a document array"
}
第一个和第二个,返回为
{
"friends": [
{
"_id": "5b51fd7c3f4ec33546a0664f",
"user": {
"profile": {
...
},
"current": {
"date": "2018-07-20T15:19:00.968Z"
}
}
},
{
"_id": "5b51fdb53f4ec33546a06655",
"user": {
"profile": {
...
},
"current": {
"date": "2018-07-20T15:19:45.102Z"
}
}
}
]
}
它应该被反转为“日期”:“2018-07-20T15:19:45.102Z”是较新的。
有没有更好更有效的方法来使用聚合和查找来做同样的事情?
用户合集
{
"_id" : ObjectId("5b51fd2a3f4ec33546a06648"),
"profile" : {
"firstname" : "user1",
"lastname" : "user1"
"avatar" : "user1.png"
}
"username" : "user1",
"friends" : [
{
"_id" : ObjectId("5b51fd7c3f4ec33546a0664f"),
"user" : ObjectId("5b51fd643f4ec33546a0664c")
},
{
"_id" : ObjectId("5b51fdb53f4ec33546a06655"),
"user" : ObjectId("5b51fd903f4ec33546a06652")
}
],
"__v" : 5,
"current" : ObjectId("5b51fd2a3f4ec33546a06649")
},
{
"_id" : ObjectId("5b51fd643f4ec33546a0664c"),
"profile" : {
"firstname" : "user2",
"lastname" : "user2"
"avatar" : "user2.png"
}
"friends" : [
{
"_id" : ObjectId("5b51fdcd3f4ec33546a06658"),
"user" : ObjectId("5b51fd2a3f4ec33546a06648")
}
],
"__v" : 5,
"current" : ObjectId("5b51fd643f4ec33546a0664d"),
"username" : "user2"
},
{
"_id" : ObjectId("5b51fd903f4ec33546a06652"),
"profile" : {
"firstname" : "user3",
"lastname" : "user3"
"avatar" : "user3.png"
},
"friends" : [
{
"_id" : ObjectId("5b51fdce3f4ec33546a0665a"),
"user" : ObjectId("5b51fd2a3f4ec33546a06648")
}
],
"__v" : 5,
"current" : ObjectId("5b51fd903f4ec33546a06653"),
"username" : "user3"
}
新系列
{
"_id" : ObjectId("5b51fd2a3f4ec33546a06649"),
"user" : ObjectId("5b51fd2a3f4ec33546a06648"),
"owner" : ObjectId("5b51fd2a3f4ec33546a06648"),
"date" : ISODate("2018-07-20T15:18:02.962Z"),
"desc" : "user1 gibberish",
"__v" : 0
}
{
"_id" : ObjectId("5b51fd643f4ec33546a0664d"),
"user" : ObjectId("5b51fd643f4ec33546a0664c"),
"owner" : ObjectId("5b51fd643f4ec33546a0664c"),
"date" : ISODate("2018-07-20T15:19:00.968Z"),
"desc" : "user2 gibberish",
"__v" : 0
}
{
"_id" : ObjectId("5b51fd903f4ec33546a06653"),
"user" : ObjectId("5b51fd903f4ec33546a06652"),
"owner" : ObjectId("5b51fd903f4ec33546a06652"),
"date" : ISODate("2018-07-20T15:19:44.102Z"),
"desc" : "user3 gibberish",
"__v" : 0
}
【问题讨论】: