MongoDB执行findOne后如何仅返回数组中匹配的单条review数据
解决方案
你当前代码仅筛选出了包含目标评论的餐厅文档,没有对文档内部的reviews数组做过滤,因此会返回完整的餐厅对象。可以通过以下两种方式实现需求:
方案1:使用findOne投影配置实现(写法简单)
async get(reviewId) { const restaurantsCollection = await restaurants(); reviewId = ObjectId(reviewId) // 第二个参数为投影配置,仅返回匹配的评论条目 const r = await restaurantsCollection.findOne( { reviews: { $elemMatch: { _id: reviewId } } }, { _id: 0, reviews: { $elemMatch: { _id: reviewId } } } ) // 投影返回的reviews数组仅有一个匹配元素,直接取第一项 return r?.reviews?.[0] ?? null }
方案2:使用聚合管道实现(扩展性更强)
async get(reviewId) { const restaurantsCollection = await restaurants(); reviewId = ObjectId(reviewId) const result = await restaurantsCollection.aggregate([ // 筛选包含目标评论的餐厅文档 { $match: { reviews: { $elemMatch: { _id: reviewId } } } }, // 拆分reviews数组为单条独立文档 { $unwind: '$reviews' }, // 过滤出目标评论 { $match: { 'reviews._id': reviewId } }, // 直接将评论对象作为返回结果的根节点 { $replaceRoot: { newRoot: '$reviews' } } ]).toArray() return result[0] ?? null }
内容的提问来源于stack exchange,提问作者Swayam Shah
相关产品推荐
相关产品推荐

