我正在使用Mongoose构建node.js应用程序,并且遇到与排序嵌入文档相关的问题。这是我使用的架构:
var locationSchema = new Schema({
lat: { type: String, required: true },
lon: { type: String, required: true },
time: { type: Date, required: true },
acc: { type: String }
})
var locationsSchema = new Schema({
userId: { type: ObjectId },
source: { type: ObjectId, required: true },
locations: [ locationSchema ]
});
我想输出嵌入在userLocations中的位置,这些位置按时间属性排序。我从MongoDb中检索数据后,我目前在JavaScript中进行排序:
function locationsDescendingTimeOrder(loc1, loc2) {
return loc2.time.getTime() - loc1.time.getTime()
}
LocationsModel.findOne({ userId: theUserId }, function(err, userLocations) {
userLocations.locations.sort(locationsDescendingTimeOrder).forEach(function(location) {
console.log('location: ' + location.time);
}
});
我确实读过Mongoose提供的排序API但是我无法弄清楚它是否可以用于排序嵌入文档的数组,如果是的话,它是否是一种明智的方法以及如何将它应用于此问题。有人可以帮帮我吗?
先谢谢你的欢呼声, 乔治
答案 0 :(得分:4)
你正在以正确的方式去做,乔治。您的其他选项要么是在第一次嵌入时按时间排序位置,要么是更传统的非嵌入路径(或最小嵌入路径,以便您可能嵌入一组ID或其他东西,但实际上您正在查询地点分开)。
答案 1 :(得分:0)
这也可以使用猫鼬排序API来完成。
LocationsModel.findOne({ userId: theUserId })
// .sort({ "locations.time": "desc" }) // option 1
.sort("-locations.time") // option 2
.exec((err, result) => {
// compute fetched data
})
Sort by field in nested array with Mongoose.js
此答案中也提到了更多方法