MongoDB:如何将集合中字符串映射为另一集合的对应整数
实现方案
方式一:MongoDB 聚合管道(数据库端处理)
假设第一个集合名为 docs,第二个评分映射集合名为 rate_mappings,可通过聚合管道完成映射转换:
db.docs.aggregate([ // 关联评分映射集合,生成键值对映射对象 { $lookup: { from: "rate_mappings", pipeline: [ { $group: { _id: null, mapping: { $mergeObjects: { $arrayToObject: [[["$rate_name", "$rate_value"]]] } } } } ], as: "rate_map" } }, // 提取映射对象 { $addFields: { rate_map: { $arrayElemAt: ["$rate_map.mapping", 0] } } }, // 将rates数组中的字符串评分替换为对应数值 { $addFields: { rates: { $map: { input: "$rates", as: "item", in: { $getField: { field: "$$item.rate", input: "$rate_map" } } } } } }, // 移除临时的rate_map字段(可选) { $project: { rate_map: 0 } } ])
方式二:客户端代码处理(以 Python 为例)
如果更倾向于在应用层处理,可先获取评分映射关系,再批量更新目标集合:
from pymongo import MongoClient # 连接数据库 client = MongoClient("mongodb://localhost:27017/") db = client["your_database_name"] # 构建评分映射字典 rate_mapping = {doc["rate_name"]: doc["rate_value"] for doc in db.rate_mappings.find()} # 遍历并更新每个文档 for doc in db.docs.find(): # 转换rates数组 new_rates = [rate_mapping[item["rate"]] for item in doc["rates"]] # 更新文档 db.docs.update_one( {"_id": doc["_id"]}, {"$set": {"rates": new_rates}} )
注意事项
- 修正原始数据中的 JSON 语法错误:原始集合文档中存在缺少逗号的问题(如
id:'1'后、{'user_id':'13','rate':'very_good'}后),实际使用时需先修正。 - 若评分映射数据不频繁变动,方式二性能更优;若映射关系经常更新,推荐使用方式一的聚合管道实时处理。
内容的提问来源于stack exchange,提问作者MrOldSir
相关产品推荐
相关产品推荐

