MongoDB:对数组进行排序,并在游标中多次返回相同的文档

时间:2013-07-24 22:28:47

标签: mongodb

假设我有一个包含这些文档的集合:

{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中实现这一目标?

1 个答案:

答案 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
  },