【问题标题】:Sort By Matched Subdocument按匹配的子文档排序
【发布时间】:2026-01-22 15:15:01
【问题描述】:

假设我有一个包含如下文档的集合:

{
    "_id": ObjectId("507f191e810c19729de860ea"),
    "users": [{
        "userId": ObjectId("507f1f77bcf86cd799439011"),
        "deleted": false,
        "updatedAt" ISODate("2013-10-17T20:46:22Z")
    }, {
        "userId": ObjectId("507f1f71baf40ea8438490fa"),
        "deleted": false,
        "updatedAt" ISODate("2013-10-17T22:19:10Z")
    }]
}

现在,假设我正在查询一个包含特定 userId 的“用户”子文档的文档,该子文档没有被删除 - 所以,查询看起来像:

{"users.userId": ObjectId("507f1f77bcf86cd799439011"), "users.deleted": false}

是否可以通过行中匹配子文档的updatedAt 属性对返回的结果集进行排序?如果没有,是否有更合适的设置方法?我是否应该创建另一个我目前嵌入在 users 键中的内容的集合,然后引用父文档?

【问题讨论】:

    标签: mongodb mongodb-query spring-data-mongodb


    【解决方案1】:

    是的,这是可能的。你可以试试这个:

     db.collection.aggregate([
     {$unwind:"$users"},
     {$match:{"users.userId":"ObjectId("507f1f77bcf86cd799439011")","users.deleted":false}},
     {$sort:{"users.updatedAt":1}}])
    

    这里的“收藏”将替换为您收藏的名称。

    【讨论】:

    • 如果我有一个索引定义为:{"users.userId": 1, "users.deleted": 1, "users.updatedAt": -1},该索引会覆盖这个查询吗?这通常会运行,因此如果出于性能原因将其放入单独的集合中更有意义 - 我宁愿这样做。
    • @ColinMorelli 但您仍然可以测试它,这是肯定的。
    • 似乎还没有对聚合查询的解释,所以很难说这会影响索引。无论如何 - 这与我将在当前文档结构中得到的一样接近 - 所以我认为我会考虑回答这个问题。
    • 我也不知道聚合框架算作单个文档,因此聚合的整个结果集受 16MB 文档限制
    • @ColinMorelli 那么这个限制会给你的结构带来问​​题吗?