我必须根据查找结果对最终结果进行排序。以下是我的汇总查询:
{ $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
答案 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
上。确保按正确的排序顺序创建索引。
现在不仅可以对结果进行排序,而且现在可以使用索引了,查询也可能更快。