MongoDB 3.6如何实现多语言内容条件查询 无目标语言时返回英语
原查询的问题
你编写的查询逻辑存在本质漏洞,$expr内部的判断规则等价于language_code in ["es", "en"]:只要文档的语言是西班牙语或者英语,都会匹配查询条件,所以当两种语言的内容同时存在时会全部返回,完全没有实现优先级筛选的效果。
正确实现方案
以下给出两种常用场景下适配MongoDB 3.6的实现写法:
场景1:查询单个指定内容的多语言版本
这种场景实现最简单,优先查询西班牙语版本,不存在时返回英语版本即可:
// 替换content_id、对应的值为你实际的业务唯一标识和查询条件 const esContent = db.sections.findOne({ content_id: "target_content_id", language_code: "es" }); const finalContent = esContent || db.sections.findOne({ content_id: "target_content_id", language_code: "en" });
场景2:批量查询全量内容,每条内容优先返回西班牙语版本,缺失则返回英语版本
需要使用聚合管道实现分组优先级筛选,注意需要将示例中的content_id替换为你实际用于区分同一内容不同语言版本的业务唯一字段(如section标识、内容slug等)。如果你的集合中同一内容的不同语言版本暂时没有单独的业务唯一键,也可以用title等内容标识字段作为分组的_id,但建议提前规范数据结构,为同一内容的多语言版本配置统一的业务唯一标识,避免查询出错。
db.sections.aggregate([ // 过滤出仅两种目标语言的文档,缩小计算范围 { $match: { language_code: { $in: ["es", "en"] } } }, // 为不同语言添加优先级权重,西班牙语权重更高 { $addFields: { lang_priority: { $cond: [ { $eq: [ "$language_code", "es" ] }, 2, 1 ] } } }, // 按内容唯一标识分组,记录每组最高优先级,同时保存组内所有文档 { $group: { _id: "$content_id", max_priority: { $max: "$lang_priority" }, doc_list: { $push: "$$ROOT" } } }, // 展开文档列表,筛选出每组优先级最高的文档 { $unwind: "$doc_list" }, { $match: { $expr: { $eq: [ "$doc_list.lang_priority", "$max_priority" ] } } }, // 恢复原始文档结构,移除临时计算字段 { $replaceRoot: { newRoot: "$doc_list" } }, { $project: { lang_priority: 0 } } ])
内容的提问来源于stack exchange,提问作者Amandeep kaur
相关产品推荐
相关产品推荐

