【问题标题】:MongoDB sort by value in embedded document arrayMongoDB按嵌入式文档数组中的值排序
【发布时间】:2021-07-07 01:17:09
【问题描述】:

我有一个 MongoDB 文档集合,格式如下所示:

{
    "_id" : ...,
    "username" : "foo",
    "challengeDetails" : [ 
        {
            "ID" : ...,
            "pb" : 30081,
        }, 
        {
            "ID" : ...,
            "pb" : 23995,
        },
        ...
    ]
}

如何为具有匹配 ID 的 challengeDetails 文档的记录编写查找查询并按相应的 PB 对它们进行排序?

我试过(这是使用NodeJS驱动,所以投影语法很奇怪)

const result = await collection
  .find(
    { "challengeDetails.ID": challengeObjectID},
    {
      projection: {"challengeDetails.$": 1},
      sort: {"challengeDetails.0.pb": 1}
    }
  )

这将返回正确的记录(带有challengeDetails 的文档仅用于匹配的 ID),但它们未排序。

我认为这行不通,因为正如docs 所说:

当 find() 方法包含 sort() 时,find() 方法在应用位置 $ 投影运算符之前应用 sort() 对匹配的文档进行排序。

但他们没有解释投影后如何排序。我将如何编写查询来执行此操作? (我感觉可能需要聚合,但对 MongoDB 不够熟悉,无法自己编写)

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    你需要使用聚合对n个数组进行排序

    • $unwind 解构数组
    • $match 匹配值
    • $sort 用于排序
    • $group重构数组

    这里是代码

    db.collection.aggregate([
      { "$unwind": "$challengeDetails" },
      { "$match": { "challengeDetails.ID": 2 } },
      { "$sort": { "challengeDetails.pb": 1 } },
      {
        "$group": {
          "_id": "$_id",
          "username": { "$first": "$username" },
          "challengeDetails": { $push: "$challengeDetails" }
        }
      }
    ])
    

    工作Mongo playground

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 2021-08-07
      • 2019-12-03
      相关资源
      最近更新 更多