如何用MongoDB查询orders数组最小rate等于指定值的完整文档?
解决方案:返回orders数组最小rate等于2的完整文档
方法一:高效计算数组最小值(推荐)
不需要拆分数组,直接利用MongoDB的数组聚合操作计算最小值,全程保留原始文档结构:
db.bookstore.aggregate([ { $addFields: { minRate: { $min: "$orders.rate" } // 计算当前文档orders数组中rate的最小值 } }, { $match: { minRate: 2 // 筛选出最小值等于2的文档 } }, { $project: { minRate: 0 // 可选:移除新增的辅助字段,不影响原始文档的其他字段 } } ])
这个方法的优势是避免了$unwind拆分数组的性能开销,同时不需要手动指定所有要保留的字段——只需要排除新增的minRate字段即可,完美适配你“字段太多不想用投影”的需求。
方法二:基于原查询逻辑修改
如果一定要沿用你最初的$unwind+$group思路,可以在分组时保存完整原始文档,最后替换根文档返回:
db.bookstore.aggregate([ { $unwind: "$orders" }, { $group: { _id: "$_id", minRateDoc: { $min: "$orders.rate" }, originalDoc: { $first: "$$ROOT" } // 存储整个原始文档 } }, { $match: { minRateDoc: 2 } }, { $replaceRoot: { newRoot: "$originalDoc" } } // 将原始文档作为返回结果的根 ])
这里用$$ROOT引用分组前的完整文档,通过$first把它保存到originalDoc字段,筛选完成后用$replaceRoot把这个字段的内容替换成返回的主文档,就能得到完整的原始数据。
内容的提问来源于stack exchange,提问作者usr_11
相关产品推荐
相关产品推荐

