在C#中通过MongoDB聚合管道提取嵌套JSON字符串字段
MongoDB聚合管道提取JSON字符串嵌套字段解决方案
假设你的MongoDB文档中,存储上述JSON结构的字段名为json_field(请替换为实际字段名),以下是直接在聚合管道中提取property_3下指定字段的方法:
方法一:使用$parseJSON(MongoDB 4.4+推荐)
$parseJSON是MongoDB 4.4及以上版本提供的原生操作符,可直接将JSON字符串转换为BSON对象,方便后续字段访问:
db.collection.aggregate([ // 第一步:将JSON字符串解析为BSON对象 { $addFields: { parsed_json: { $parseJSON: "$json_field" } } }, // 第二步:提取property_3下的目标字段 { $project: { _id: 1, // 按需保留原文档ID target_fields: { _some_property_2: "$parsed_json.property_3._some_property_2", some_property_3: "$parsed_json.property_3.some_property_3" // 可继续添加需要提取的其他字段 } } } ])
阶段说明:
$addFields:新增parsed_json字段,将原JSON字符串解析为可操作的BSON文档,此时就能像访问普通嵌套字段一样访问property_3。- 也可以直接在
$project阶段合并解析逻辑,简化管道:
db.collection.aggregate([ { $project: { _id: 1, target_fields: { _some_property_2: { $getField: { field: "_some_property_2", input: { $getField: { field: "property_3", input: { $parseJSON: "$json_field" } } } } }, some_property_3: { $getField: { field: "some_property_3", input: { $getField: { field: "property_3", input: { $parseJSON: "$json_field" } } } } } } } } ])
方法二:兼容低版本MongoDB(4.0+)
如果你的MongoDB版本低于4.4,无法使用$parseJSON,可以通过$function调用JavaScript解析JSON(注意:大量数据处理时会有性能损耗):
db.collection.aggregate([ { $addFields: { parsed_json: { $function: { body: function(jsonStr) { return JSON.parse(jsonStr); }, args: ["$json_field"], lang: "js" } } } }, { $project: { _id: 1, target_fields: { _some_property_2: "$parsed_json.property_3._some_property_2", some_property_3: "$parsed_json.property_3.some_property_3" } } } ])
内容的提问来源于stack exchange,提问作者Karan Kapadia
相关产品推荐
相关产品推荐

