我Mongodb的批量更新是根据MongoDB的_id的字段来实现的,因为部署在阿里云上,然后_id方面也查了很久的信息,感觉上应该是没有问题的.
首先说下思路,就是首先判断id存在否,不存在则直接查前200条,然后记录最后一条的ID,200条批量更新,结束后返回给循环,下次继续使用,如果数量不足200,则返回false,结束循环。
下面列出部分关键代码:

1 FilterDefinition<BsonDocument> filter; 2 if (objectId.Length == 0) 3 { 4 filter = Builders<BsonDocument>.Filter.Exists("InsertTimeSpan", true); 5 } 6 else 7 { 8 filter = (Builders<BsonDocument>.Filter.Gt("_id", ObjectId.Parse(objectId)) & 9 Builders<BsonDocument>.Filter.Exists("InsertTimeSpan", true)); 10 } 11 // string selMaxId = string.Format("select orderId from hei where id=(select max(id) from hei)"); 12 var collection = MongoAccessService.GetMongoCollection<BsonDocument>("Mongodb", collectionName); 13 var projection = Builders<BsonDocument>.Projection 14 .Include("raw_data.mobile_brief.number") 15 .Include("InsertTimeSpan") 16 .Include("orderId") 17 .Include("taskId") 18 .Include("cityName") 19 .Include("operators") 20 .Include("raw_data.mobile_details") 21 .Include("_id") 22 ; 23 var result = collection.Find(filter).Project(projection).Limit(200); 24 var listResult = result.ToList(); 25 if (listResult.Count > 0) 26 { 27 objectId = listResult[listResult.Count - 1]["_id"].ToString(); 28 }
括号可能有些问题,不要在意。
批量更新代码:

1 ///批量更新 2 List<UpdateOneModel<BsonDocument>> das = new List<UpdateOneModel<BsonDocument>>(); 3 for (int i = 0; i < updateGjjMogos.Count; i++) 4 { 5 var filterUpdate = Builders<BsonDocument>.Filter.Eq("_id", updateGjjMogos[i].Id); 6 var update = Builders<BsonDocument>.Update.Set("data.general_analyzed_data.start_date", updateGjjMogos[i].MinDateTimes).Set("data.general_analyzed_data.end_date",(updateGjjMogos[i].MaxDateTimes)); 7 // var bsonDoc = updateGjjMogos[i].ToBsonDocument(); 8 var sd = new UpdateOneModel<BsonDocument>(filterUpdate, update) { IsUpsert = true }; 9 das.Add(sd); 10 } 11 var res = collection.BulkWrite(das);
将要更新的model放到UpdateModel实现list批量更新
有什么不足和建议可以和我提,共同进步!