Mongoose按条件获取多语言name字段相关问题咨询
问题解答
Q1:查询仅返回对应法语文本
要实现该需求可以使用Mongoose的聚合管道处理,先匹配查询条件,再对name数组做字段转换,示例代码如下:
db.langs.aggregate([ // 第一步:匹配查询条件,和原find条件一致 { $match: { "name.language": "fr-CA", parentId: 1 } }, // 第二步:转换name字段为对应的法语文本 { $set: { name: { // 取出name数组中语言为fr-CA的第一个元素的text值 $getField: { field: "text", input: { $arrayElemAt: [ { $filter: { input: "$name", cond: { $eq: ["$$this.language", "fr-CA"] } } }, 0 ] } } } } } ])
该写法会保留文档所有原有字段,仅将name字段从数组替换为匹配到的法语文本。
Q2:优先返回法语、法语不存在则返回英语
Mongoose支持该需求,依然通过聚合管道实现,核心是对多语言做优先级判断,示例代码如下:
db.langs.aggregate([ // 第一步:匹配parentId条件,不需要限制必须有法语 { $match: { parentId: 1 } }, // 第二步:按优先级取对应语言的文本 { $set: { name: { // 先判断是否存在法语,存在则返回法语文本,否则返回英语文本 $ifNull: [ // 尝试取法语文本 { $getField: { field: "text", input: { $arrayElemAt: [ { $filter: { input: "$name", cond: { $eq: ["$$this.language", "fr-CA"] } } }, 0 ] } } }, // 法语不存在时取英语文本 { $getField: { field: "text", input: { $arrayElemAt: [ { $filter: { input: "$name", cond: { $eq: ["$$this.language", "en-US"] } } }, 0 ] } } } ] } } } ])
如果后续需要新增其他优先级语言,只需要在$ifNull的参数数组中按优先级顺序新增对应语言的提取逻辑即可。
内容的提问来源于stack exchange,提问作者Mehran Ishanian
相关产品推荐
相关产品推荐

