如何通过Mongoose查询对嵌入文档数组进行排序?

时间:2012-02-19 12:49:48

标签: node.js mongoose

我正在使用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但是我无法弄清楚它是否可以用于排序嵌入文档的数组,如果是的话,它是否是一种明智的方法以及如何将它应用于此问题。有人可以帮帮我吗?

先谢谢你的欢呼声, 乔治

2 个答案:

答案 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

此答案中也提到了更多方法

Sorting Options in mogoose

Mongoose Sort API