基于$ sort的mongodb查找结果

时间:2017-06-26 12:05:58

标签: mongodb aggregation-framework lookup

我必须根据查找结果对最终结果进行排序。以下是我的汇总查询:

{ $match : {status:'active'},
{ $limit : 10},
{ $lookup:
  {
    from        : "metas",
    localField  : "_id",
    foreignField: "post_id",
    as          : "meta"
  }
}

此查询生成结果为:

  {
    "_id": "594b6adc2a8c4f294025e46e",
    "title": "Test 1",
    "created_at": "2017-06-22T06:59:40.809Z",
    "meta": [
        {
            "_id": "594b6b072a8c4f294025e46f",
            "post_id": "594b6adc2a8c4f294025e46e",
            "views": 1,
        },
        {
            "_id": "594b6b1c2a8c4f294025e471",
            "post_id": "594b6adc2a8c4f294025e46e",
        }
    ],
},
{
    "_id": "594b6adc2a8c4f29402f465",
    "title": "Test 2",
    "created_at": "2017-06-22T06:59:40.809Z",
    "meta": [
        {
            "_id": "594b6b072a8c4f294025e46f",
            "post_id": "594b6adc2a8c4f29402f465",
            "views": 0,
        },
        {
            "_id": "594b6b1c2a8c4f294025e471",
            "post_id": "594b6adc2a8c4f29402f465",
        }
    ],
},
{
    "_id": "594b6adc2a8c4f29856d442",
    "title": "Test 3",
    "created_at": "2017-06-22T06:59:40.809Z",
    "meta": [
        {
            "_id": "594b6b072a8c4f294025e46f",
            "post_id": "594b6adc2a8c4f29856d442",
            "views": 3,
        },
        {
            "_id": "594b6b1c2a8c4f294025e471",
            "post_id": "594b6adc2a8c4f29856d442",
        }
    ],
}

现在我想要的是根据' meta' 下的' 视图对这些结果进行排序。类似结果将按' meta.views' 的降序列出。第一个结果是meta,其中views = 3,则views = 1,然后是views = 0

2 个答案:

答案 0 :(得分:3)

$ unwind运算符将数组拆分为数组中包含的每个对象的单独文档

例如

db.collection.aggregate(

    // Pipeline
    [


        // Stage 1
        {
            $unwind: {
                path : "$meta"
            }
        },

        // Stage 2
        {
            $sort: {
              'meta.views':-1
            }
        },

    ]


);

答案 1 :(得分:0)

尽管 $ lookup 不支持排序,但我认为(可能也是最快的)最简单的解决方案是在相关集合上创建适当的索引。

在这种情况下,metas集合上的索引在外来字段post_id上以及需要对其进行排序的字段views上。确保按正确的排序顺序创建索引。 现在不仅可以对结果进行排序,而且现在可以使用索引了,查询也可能更快。