You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:30:03