按字段/键名称对MongoDB文档进行排序

问题描述 投票:1回答:2

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

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

是否可以对文档的返回键/字段进行排序?我看到的所有示例都是根据字段的值而不是键的名称进行排序。

mongodb mongodb-query aggregation-framework robo3t
2个回答
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 }
    }
   ])

Test: mongoplayground


1
投票

[有一种方法,但是您不喜欢它。从技术上讲,您可以通过将对象转换为数组,展开,排序,将其归组并将组转换为对象来进行聚合:

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和其他少数情况。

© www.soinside.com 2019 - 2024. All rights reserved.