如何过滤JSON响应并批量更新MongoDB中的多个文档?
批量解析JSON响应并更新MongoDB多文档
一、正确解析多订单结构的JSON
你的JSON外层以订单ID为键,每个键对应包含订单详情的子对象,直接从根节点取start_count会返回null——因为这些字段嵌套在子对象里。可以通过遍历JObject的属性提取每个订单的信息:
JObject responseObject = JObject.Parse(responseContent); // 遍历所有订单项 foreach (var orderProp in responseObject.Properties()) { string orderID = orderProp.Name; // 获取订单ID,如"88996940" JObject orderDetails = (JObject)orderProp.Value; string orderStartCount = orderDetails["start_count"].ToString(); string orderStatus = orderDetails["status"].ToString(); string orderRemains = orderDetails["remains"].ToString(); // 此处可暂存更新信息,或直接执行数据库更新 }
二、MongoDB批量更新多文档
单个循环调用UpdateOne也能实现需求,但效率较低,推荐用BulkWrite批量执行更新,减少数据库请求次数:
方式1:构建批量更新操作列表(推荐)
var updateOperations = new List<WriteModel<BsonDocument>>(); JObject responseObject = JObject.Parse(responseContent); foreach (var orderProp in responseObject.Properties()) { string orderID = orderProp.Name; JObject orderDetails = (JObject)orderProp.Value; // 构建过滤条件:匹配目标订单ID var filter = Builders<BsonDocument>.Filter.Eq("orderID", orderID); // 构建更新内容(注意链式调用写法,无需重复写.Update.Set) var update = Builders<BsonDocument>.Update .Set("status", orderDetails["status"].ToString()) .Set("start_count", orderDetails["start_count"].ToString()) .Set("remains", orderDetails["remains"].ToString()); // 添加单个更新操作到列表,确保只更新对应订单 updateOperations.Add(new UpdateOneModel<BsonDocument>(filter, update)); } // 执行批量更新 MyCollection.BulkWrite(updateOperations);
方式2:循环调用UpdateOne(适合小批量场景)
如果订单数量不多,也可直接在遍历JSON时逐个更新:
JObject responseObject = JObject.Parse(responseContent); foreach (var orderProp in responseObject.Properties()) { string orderID = orderProp.Name; JObject orderDetails = (JObject)orderProp.Value; var filter = Builders<BsonDocument>.Filter.Eq("orderID", orderID); var update = Builders<BsonDocument>.Update .Set("status", orderDetails["status"].ToString()) .Set("start_count", orderDetails["start_count"].ToString()) .Set("remains", orderDetails["remains"].ToString()); MyCollection.UpdateOne(filter, update); }
内容的提问来源于stack exchange,提问作者vdmua
相关产品推荐
相关产品推荐

