MongoDB:如何按数组中指定对象的字段对文档排序
MongoDB查询:筛选含特定food.name的文档并按对应price排序
要实现筛选出包含指定food.name的文档,并按该食品对应的price排序,最可靠的方式是使用聚合管道——普通find查询无法直接针对数组内的特定元素进行排序。以下是针对示例需求(查找food.name="steak"的文档并按其price升序排序)的具体实现:
完整聚合查询代码
db.yourCollectionName.aggregate([ // 1. 过滤出包含目标食品的文档 { $match: { "food.name": "steak" } }, // 2. 提取目标食品的price作为临时排序字段 { $addFields: { targetPrice: { $getField: { field: "price", input: { $arrayElemAt: [ { $filter: { input: "$food", cond: { $eq: ["$$this.name", "steak"] } } }, 0 ] } } } } }, // 3. 按临时字段升序排序(降序改为-1) { $sort: { targetPrice: 1 } }, // 4. 移除临时字段,保持原文档结构 { $project: { targetPrice: 0 } } ])
代码说明
- $match阶段:快速过滤出所有包含
food.name="steak"的文档,减少后续处理的数据量。 - $addFields阶段:
- 使用
$filter从food数组中筛选出name等于"steak"的元素; - 用
$arrayElemAt取筛选结果的第一个元素(假设每个文档中同一食品名称仅出现一次); - 通过
$getField提取该元素的price值,存入临时字段targetPrice。
- 使用
- $sort阶段:根据临时字段
targetPrice进行升序排序,若需要降序排列,将值改为-1即可。 - $project阶段:移除临时字段
targetPrice,返回与原文档结构一致的结果。
灵活调整
如果需要查询其他食品(比如"soup"),只需将代码中两处的"steak"替换为目标食品名称即可。
内容的提问来源于stack exchange,提问作者Fretzo
相关产品推荐
相关产品推荐

