我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批量更新
有什么不足和建議可以和我提,共同進步!