在mongodb聚合中,在查找之前或查找之后应用排序?

时间:2017-01-06 10:00:31

标签: mongodb aggregation-framework

我正在编写一个聚合查询,我希望在两个集合之间执行MongoDB中的连接,为此我使用$ lookup,现在我的问题是$ lookup是否通过排序改变结果的顺序?因为如果它确实如此,那么我需要在$ lookup之后进行排序,如果没有那么我可以在$ lookup之前使用它吗?

我的代码如下:

brandmodel.aggregate(
     {$project: { '_id':0, 'brand_id': 1, 'brand_name':1, 'brand_icon':1, 'banner_image': 1, 'weight': 1} },
     {$lookup: {from: "student_coupons",localField: "brand_id",foreignField: "brand_id",as: "coupons"}},
     {$unwind : "$coupons"},
     {$sort: {weight: -1, "coupons.time_posted": -1}}, // SHOULD I WRITE THIS BEFORE LOOKUP OR AFTER LOOKUP

1 个答案:

答案 0 :(得分:1)

在MongoDB 3.6中,$ lookup具有更富表现力的方式,您可以访问源文档的字段并在$ lookup阶段进行进一步的管道操作。参见documentation

例如,

db.movies.aggregate([
{ $match : { _id : ObjectId("573a1390f29313caabcd414c")} },
{ $lookup : {from: "comments", 
 let: {'id' : '$_id' },
 pipeline: [
 { $match : { '$expr': { '$eq': [ '$movie_id', '$$id' ] } }},
 { $sort: {'date': -1} }
 ],
 as:  "comments"
  }
 }   
])

您必须在let中声明源集合中想要的任何字段,并根据需要进行匹配(这是可选的)。然后,您可以使用需要在正在查找的集合中应用的pipeline阶段。