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

Posted

技术标签:

【中文标题】如何通过 Mongoose 查询对嵌入文档数组进行排序?【英文标题】:How to sort array of embedded documents via Mongoose query? 【发布时间】:2012-03-10 02:15:46 【问题描述】:

我正在使用 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,但我不知道它是否可用于对嵌入式文档数组进行排序,如果可以,它是否是一种明智的方法以及如何将其应用于此问题。谁能帮帮我好吗?

在此先感谢和欢呼, 乔治

【问题讨论】:

【参考方案1】:

这也可以使用猫鼬排序 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

【讨论】:

【参考方案2】:

你做对了,乔治。您的其他选择是首先在嵌入时按时间对位置进行排序,或者采用更传统的非嵌入路线(或最小嵌入路线,以便您可能嵌入一组 id 或其他东西,但您实际上是在查询位置分开)。

【讨论】:

谢谢杰德。我最终使用了您提出的方法 - 在嵌入时对位置进行排序。对我来说很好。 这也是我的问题,但是如何在嵌入时对嵌入的文档进行排序? 我想通了。您可能的意思是,通过 .push 或 .unshift 添加新文档时,它将被正确定位。

以上是关于如何通过 Mongoose 查询对嵌入文档数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mongoose 的嵌入式文档中检索数组的最后一个对象?

使用 Mongoose 查询嵌套的嵌入文档

如何在 MongoDB 中对聚合查询结果进行分页并获得总文档数(Node.js + Mongoose)?

如何在嵌入式数组mongodb中查询嵌入式文档

通过 Mongoose、Node.js、MongodB 中的特定属性查找嵌入式文档

有没有办法通过在 Mongoose 中查询来更新文档数组中的对象?