按 field/key 名称对 MongoDB 文档排序
Sort MongoDB Document by field/key name
我正在使用 Robo 3T 查看我的 MongoDB 文档,我想按名称对文档中的键进行排序。
我的文档可能看起来像
{"Y":3,"X":"Example","A":{"complex_obj":{}}
最后,我希望返回的文档看起来像我 运行 查找查询并对其应用排序时的样子。 {"A":{"complex_obj":{},"X":"Example","Y":3}
有没有办法对文档返回的键/字段进行排序?我看到的所有示例都是基于字段的值而不是键的名称应用排序。
有一种方法,但你不会喜欢它。从技术上讲,您可以通过将对象转换为数组、展开、排序、将其分组并将组转换为对象来实现聚合:
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,还有其他一些边缘情况。
不确定为什么字段顺序在 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
我正在使用 Robo 3T 查看我的 MongoDB 文档,我想按名称对文档中的键进行排序。
我的文档可能看起来像
{"Y":3,"X":"Example","A":{"complex_obj":{}}
最后,我希望返回的文档看起来像我 运行 查找查询并对其应用排序时的样子。 {"A":{"complex_obj":{},"X":"Example","Y":3}
有没有办法对文档返回的键/字段进行排序?我看到的所有示例都是基于字段的值而不是键的名称应用排序。
有一种方法,但你不会喜欢它。从技术上讲,您可以通过将对象转换为数组、展开、排序、将其分组并将组转换为对象来实现聚合:
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,还有其他一些边缘情况。
不确定为什么字段顺序在 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