MongoDB未知字段名时引用字段及本地化子文档查询方案
MongoDB动态本地化字段的唯一字符串查询方案
针对你不知道本地化字段(myLocalizedField)的语言键、且需筛选出至少包含指定子串的文档,并提取所有语言的唯一字符串需求,可通过以下聚合管道实现:
完整聚合管道
[ // 匹配至少一个语言字段包含目标子串的文档 { $match: { $expr: { $anyElementTrue: { $map: { input: { $objectToArray: "$myLocalizedField" }, as: "langItem", in: { $regexMatch: { input: "$$langItem.v", regex: "你的目标子串", options: "i" } } } } } } }, // 将本地化对象转为键值对数组(键=语言代码,值=字符串) { $addFields: { langEntries: { $objectToArray: "$myLocalizedField" } } }, // 展开数组,每个语言键值对成为独立文档 { $unwind: "$langEntries" }, // 按字符串内容分组,去重并可选记录对应语言 { $group: { _id: "$langEntries.v", // 以字符串内容作为分组依据实现去重 languages: { $addToSet: "$langEntries.k" } // 可选:收集该字符串对应的所有语言代码 } }, // 可选:重命名字段让结果更直观 { $project: { _id: 0, string: "$_id", languages: 1 } } ]
关键阶段说明
$match阶段
- 用
$objectToArray将动态键的本地化对象转为[{k: 语言代码, v: 字符串}]格式的数组 - 通过
$map遍历数组元素,用$regexMatch检查每个字符串是否包含目标子串 $anyElementTrue确保只要有一个语言字段符合条件,该文档就会被匹配
- 用
$group阶段
- 以
$langEntries.v(字符串内容)作为_id分组,自动实现字符串去重 - 可选的
$addToSet: "$langEntries.k"会收集该字符串出现过的所有语言代码,方便查看多语言对应关系
- 以
如果只需要提取唯一字符串列表,可将最后两个阶段替换为:
{ $group: { _id: null, uniqueStrings: { $addToSet: "$langEntries.v" } } }, { $project: { _id: 0, uniqueStrings: 1 } }
内容的提问来源于stack exchange,提问作者Armin
相关产品推荐
相关产品推荐

