如何在MongoDB中查询friendsArray并按lastTimestamp排序取前10条
错误原因
你用到的$orderBy并非MongoDB投影支持的操作符,该参数仅用于旧版整表查询的全局排序,无法作用于单个文档内的数组字段。要实现服务端对数组内部元素排序并截取,需要使用MongoDB聚合管道完成。
解决方案
方案1:MongoDB 5.2及以上版本(推荐)
直接使用$sortArray聚合操作符完成数组内部排序,配合$slice截取前10条,全程仅在数据库服务端运算,无需拉取全量数组到本地:
pipeline = [ # 匹配对应userId的文档 {"$match": {"userId": "123"}}, {"$project": { "friendsArray": { # 按lastTimestamp升序排序,降序排序将1修改为-1即可 "$sortArray": {"input": "$friendsArray", "sortBy": {"lastTimestamp": 1}}, # 截取排序后的前10个元素 "$slice": 10 } }} ] # 执行聚合查询取结果 result = db.user_relations.aggregate(pipeline).next() listOfUsers = result.get("friendsArray", [])
方案2:低版本MongoDB兼容方案
如果你使用的MongoDB版本低于5.2,没有内置$sortArray操作符,可以通过拆分数组→排序→截取→重组的流程实现:
pipeline = [ {"$match": {"userId": "123"}}, # 将friendsArray拆分为多条单元素文档 {"$unwind": "$friendsArray"}, # 按lastTimestamp升序排序,降序排序将1修改为-1即可 {"$sort": {"friendsArray.lastTimestamp": 1}}, # 取排序后的前10条 {"$limit": 10}, # 将拆分的元素重新组合为数组 {"$group": { "_id": "$_id", "friendsArray": {"$push": "$friendsArray"} }} ] result = db.user_relations.aggregate(pipeline).next() listOfUsers = result.get("friendsArray", [])
内容的提问来源于stack exchange,提问作者bd_28
相关产品推荐
相关产品推荐

