【问题标题】:Sort MongoDB Document by field/key name按字段/键名对 MongoDB 文档进行排序
【发布时间】:2020-09-08 16:24:41
【问题描述】:

我正在使用 Robo 3T 查看我的 MongoDB 文档,我想按名称对文档中的键进行排序。

我的文档可能看起来像 {"Y":3,"X":"Example","A":{"complex_obj":{}} 最后,我希望返回的文档看起来像我运行查找查询并对其应用排序时的样子。 {"A":{"complex_obj":{},"X":"Example","Y":3}

有没有办法对文档的返回键/字段进行排序?我看到的所有示例都是基于字段的值而不是键的名称来应用排序。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework robo3t


    【解决方案1】:

    不确定为什么 JSON 文档中的字段顺序很重要,但您可以尝试以下aggregation 查询:

    db.collection.aggregate([
        {
          $project: { data: { $objectToArray: "$$ROOT" } }
        },
        {
          $unwind: "$data"
        },
        {
          $sort: { "data.k": 1 }
        },
        {
          $group: { _id: "_id", data: { $push: "$$ROOT.data" } }
        },
        {
          $replaceRoot: { newRoot: { $arrayToObject: "$data" } }
        },
        {
          $project: { _id: 0 }
        }
       ])
    

    测试: mongoplayground

    【讨论】:

    • 在这种情况下,我使用 GUI 工具作为代表检查单个文档,以查看在我处理每个文档时内容可能是什么样子。通过对它进行排序,与按照原始顺序查找我以前见过的字段相比,它更容易找到。
    【解决方案2】:

    有一种方法,但你不会喜欢它。从技术上讲,您可以通过将对象转换为数组、展开、排序、分组并将组转换为对象来实现聚合:

    db.collection.aggregate([
      {
        $project: {
          o: {
            $objectToArray: "$$ROOT"
          }
        }
      },
      {
        $unwind: "$o"
      },
      {
        $sort: {
          "o.k": 1
        }
      },
      {
        $group: {
          _id: "$_id",
          o: {
            $push: "$o"
          }
        }
      },
      {
        $replaceRoot: {
          newRoot: {
            $arrayToObject: "$o"
          }
        }
      }
    ])
    

    但你不想这样做。太麻烦,太贵,太少好处。

    Mongo 在设计上会在插入键时保留键的顺序。好吧,除了 _id 和其他一些边缘情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 2017-12-16
      • 2023-01-12
      • 1970-01-01
      • 2015-05-07
      • 2014-08-21
      • 2014-02-24
      相关资源
      最近更新 更多