You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于关联子文档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换成$sum
    total_score: {
      $cond: {
        if: { $eq: [{ $size: "$related_books" }, 0] },
        then: 0,
        else: { $sum: "$related_books.score" }
      }
    }
    
  • 按书籍最高Score排序:把$avg换成$max
    max_score: {
      $cond: {
        if: { $eq: [{ $size: "$related_books" }, 0] },
        then: 0,
        else: { $max: "$related_books.score" }
      }
    }
    

记得同时把$sort阶段的字段改成对应的新字段哦(比如total_score或max_score)。

内容的提问来源于stack exchange,提问作者pietro abate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:36:19