我有以下架构:
const userSchema = new Schema({
local: {
email: {type: String, unique: true, sparse: true, lowercase: true, trim: true, required: true},
password: {type: String, required: true},
},
username: {type: String, unique: true, lowercase: true, trim: true},
Items: [{
name: {type: String, trim: true},
createdAt: {type: Date, default: Date.now}
}]
});
我使用以下查询来检索所有项目:
User.findById(req.user.id, 'Items -_id', (err, user) => { ... });
返回以下内容:
{ Items:
[
{ name: 'test1',
_id: 58c70800a03d09a31bb7fc17,
createdAt: Mon Mar 13 2017 20:58:40 GMT+0000 (GMT) },
{ name: 'test2',
_id: 58c70826a03d09a31bb7fc18,
createdAt: Mon Mar 13 2017 20:59:18 GMT+0000 (GMT) }
]
}
我的问题是:如何编辑我的mongoose查询以返回基于Items
属性按降序排序的createdAt
数组内的对象?即test2
出现在test1
之上。
(一些额外的信息,项目数组平均每个用户的长度为3-10,并且我使用Nodejs作为后端,因此,在应用程序端对数组进行排序是可以忍受的,因为由于Nodejs的单线程特性,它的体积小或效率太低?),谢谢。
答案 0 :(得分:0)
您可以使用aggregation来匹配_id
,展开Items
数组,执行降序排序并仅投影Items
字段:
User.aggregate([{
"$match": {
"_id": new mongoose.mongo.ObjectId("58c7fa6987200dfc592d088c")
}
}, {
"$unwind": "$Items"
}, {
"$sort": {
"Items.createdAt": -1
}
}, {
"$group": {
"Items": {
"$push": "$Items"
},
"_id": 1
}
}, {
"$project": {
"_id": 0,
"Items": 1
}
}], function(err, res) {
console.log(res);
})