假设我有一个包含这些文档的集合:
{sort:[1,2,4,6], fruit:'apple'}
{sort:[3], fruit:'cherry'}
{sort:[5], fruit:'orange'}
我想运行类似这样的查询:
db.collection.find().sort({sort: -1})
但让它返回文件而不首先重复删除它们:
{sort:[1,2,4,6], fruit:'apple'}
{sort:[1,2,4,6], fruit:'apple'}
{sort:[3], fruit:'cherry'}
{sort:[1,2,4,6], fruit:'apple'}
{sort:[5], fruit:'orange'}
{sort:[1,2,4,6], fruit:'apple'}
而不是:
{sort:[1,2,4,6], fruit:'apple'}
{sort:[3], fruit:'cherry'}
{sort:[5], fruit:'orange'}
有没有办法在当前的MongoDB中实现这一目标?
答案 0 :(得分:2)
您可以使用聚合框架的$unwind operator将数组展开为多个文档。
db.fruits.aggregate(
{$unwind: "$sort"},
{$sort: {sort: 1}}
)
$unwind
操作通过创建多个文档来“展开”文档上的数组,该文档对应于该数组中的每个值。然后,我们只根据给出的标准进行排序。所以对于输入:
> db.fruits.insert({sort:[1,2,4,6], fruit:'apple'})
> db.fruits.insert({sort:[3], fruit:'cherry'})
> db.fruits.insert({sort:[5], fruit:'orange'})
我们得到了结果输出:
> db.fruits.aggregate({$unwind: "$sort"}, {$sort: {sort: 1}})
{
"result" : [
{
"_id" : ObjectId("51f0592c8a542caf3f07fa66"),
"sort" : 1,
"fruit" : "apple"
},
{
"_id" : ObjectId("51f0592c8a542caf3f07fa66"),
"sort" : 2,
"fruit" : "apple"
},
{
"_id" : ObjectId("51f059358a542caf3f07fa67"),
"sort" : 3,
"fruit" : "cherry"
},
{
"_id" : ObjectId("51f0592c8a542caf3f07fa66"),
"sort" : 4,
"fruit" : "apple"
},
{
"_id" : ObjectId("51f0593b8a542caf3f07fa68"),
"sort" : 5,
"fruit" : "orange"
},
{
"_id" : ObjectId("51f0592c8a542caf3f07fa66"),
"sort" : 6,
"fruit" : "apple"
}
],
"ok" : 1
}
如果您需要维护原始排序数组,可以使用$project
创建原始文档的投影,将排序字段复制到expanded_sort
字段中,然后将其解开,如此:
db.fruits.aggregate(
{$project: {sort: 1, fruit: 1, expanded_sort: "$sort"}},
{$unwind: "$expanded_sort"},
{$sort: {expanded_sort: 1}}
)
这样可以得到如下结果:
"result" : [
{
"_id" : ObjectId("51f0592c8a542caf3f07fa66"),
"sort" : [ 1, 2, 4, 6 ],
"fruit" : "apple",
"expanded_sort" : 1
},