【发布时间】:2014-05-18 07:22:01
【问题描述】:
我想在查询时对嵌套数组进行排序,同时投影文档中的所有字段。
示例文档:
{ "_id" : 0, "unknown_field" : "foo", "array_to_sort" : [ { "a" : 3, "b" : 4 }, { "a" : 3, "b" : 3 }, { "a" : 1, "b" : 0 } ] }
我可以使用聚合执行排序,但我无法保留我需要的所有字段。应用程序在查询时不知道每个文档中可能出现哪些其他字段,因此我无法明确投影它们。如果我有一个通配符来投影所有字段,那么这将起作用:
db.c.aggregate([
{$unwind: "$array_to_sort"},
{$sort: {"array_to_sort.b":1, "array_to_sort:a": 1}},
{$group: {_id:"$_id", array_to_sort: {$push:"$array_to_sort"}}}
]);
...但不幸的是,它产生的结果不包含“unknown_field”:
{
"_id" : 0,
"array_to_sort" : [
{
"a" : 1,
"b" : 0
},
{
"a" : 3,
"b" : 3
},
{
"a" : 3,
"b" : 4
}
]
}
这里是插入命令,如果您想尝试一下:
db.c.insert({"unknown_field": "foo", "array_to_sort": [{"a": 3, "b": 4}, {"a": 3, "b":3}, {"a": 1, "b":0}]})
我无法对数组进行预排序,因为排序标准是动态的。我可能在查询时按 a 和/或 b 升序/降序的任意组合进行排序。我意识到我可能需要在我的客户端应用程序中执行此操作,但如果我可以在 mongo 中执行此操作会很不错,因为这样我还可以 $slice/skip/limit 分页的结果,而不是每次都检索整个数组。
【问题讨论】:
标签: mongodb mongodb-query aggregation-framework