基于关联子文档score对MongoDB Editors集合排序的聚合查询需求
基于关联书籍Score排序Editors的MongoDB聚合查询方案
我来帮你搞定这个需求!要实现根据关联的books集合里的score字段对editors进行排序,我们可以用MongoDB的聚合框架,通过$lookup关联两个集合,再计算排序用的score指标,最后完成排序。下面是具体的实现方案:
基础实现(按书籍平均Score排序)
这个例子里我们按每个编辑旗下书籍的平均score降序排列,同时处理了没有关联书籍的编辑(给默认score 0):
db.editors.aggregate([ // 关联books集合,拉取当前编辑对应的所有书籍 { $lookup: { from: "books", localField: "_id", foreignField: "parentId", as: "related_books" } }, // 计算平均score,处理无书籍的编辑 { $addFields: { average_score: { $cond: { if: { $eq: [{ $size: "$related_books" }, 0] }, then: 0, else: { $avg: "$related_books.score" } } } } }, // 按平均score降序排序(升序改1即可) { $sort: { average_score: -1 } }, // 可选:移除关联书籍数组,让结果更简洁 { $project: { related_books: 0 } } ])
各阶段解释
- $lookup:建立
editors和books的关联,将每个编辑对应的所有书籍存入related_books数组,关联条件是editor的_id等于book的parentId。 - $addFields:新增
average_score字段,用$avg计算关联书籍的score平均值;通过$cond判断,如果编辑没有关联书籍(数组长度为0),就给默认值0,避免null干扰排序。 - $sort:按照计算出的
average_score排序,-1是降序,1是升序,按需调整。 - $project:可选步骤,如果你不需要返回
related_books数组,可以用这个阶段把它排除,让结果更清爽。
扩展:其他排序逻辑
如果你想按其他score维度排序,只需要修改$addFields里的计算逻辑即可:
- 按书籍总分排序:把
$avg换成$sumtotal_score: { $cond: { if: { $eq: [{ $size: "$related_books" }, 0] }, then: 0, else: { $sum: "$related_books.score" } } } - 按书籍最高Score排序:把
$avg换成$maxmax_score: { $cond: { if: { $eq: [{ $size: "$related_books" }, 0] }, then: 0, else: { $max: "$related_books.score" } } }
记得同时把$sort阶段的字段改成对应的新字段哦(比如total_score或max_score)。
内容的提问来源于stack exchange,提问作者pietro abate
相关产品推荐
相关产品推荐

