I can't seem to sort this mongo/mongoose query. The first one returns the exact results, just not sorted in the opposite direction.
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);
I've tried
.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})
as well as
.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 } }
},
})
and this one which gives an error
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"
}
with the first and second one, it comes back as
{
"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"
}
}
}
]
}
It should be reversed as "date": "2018-07-20T15:19:45.102Z" is more recent.
Is there a better more efficient way of doing the same thing with aggregate and lookup?
Users collection
{
"_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"
}
New collection
{
"_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
}