MongoDB學習(xi)筆記~批量(liang)插入方法的實現
批(pi)量插入在(zai)(zai)(zai)EF時代大(da)叔就自己(ji)封裝過,原(yuan)理是將多次(ci)(ci)SQL連接和(he)多次(ci)(ci)向SQL發送的(de)(de)(de)指(zhi)令減少到1次(ci)(ci),或者(zhe)1000條(tiao)數據1次(ci)(ci),而(er)對于EF產生的(de)(de)(de)語(yu)句(ju)來(lai)說,這(zhe)無疑是性能高效的(de)(de)(de),因(yin)為EF這(zhe)邊在(zai)(zai)(zai)處理時,每個語(yu)句(ju)都(dou)會向SQL發送一次(ci)(ci),當(dang)然就算它(ta)是在(zai)(zai)(zai)一個SQL連接里,向SQL發送N多條(tiao)指(zhi)令,也(ye)是性能低下的(de)(de)(de)。
對于(yu)MongoDB來(lai)(lai)說也是一樣,如何(he)減(jian)少(shao)與Mongo通信的(de)(de)次數,是提(ti)高(gao)插入操作的(de)(de)前提(ti),還好,官方驅動(dong)為我們繼承(cheng)了這個功能,使用WriteModel類型來(lai)(lai)存(cun)儲要插入的(de)(de)集合,使用InsertOneModel類型來(lai)(lai)承(cheng)載要插入的(de)(de)對象,這一切都(dou)很直觀,代碼也很清(qing)晰(xi)!
public void Insert(IEnumerable<TEntity> item) { var list = new List<WriteModel<TEntity>>(); foreach (var iitem in item) { list.Add(new InsertOneModel<TEntity>(iitem)); } _table.BulkWriteAsync(list).Wait(); }
而測試完(wan)批量添加(jia)后,就做了批量更新和刪(shan)除,不過遺憾的(de)(de)是,都失敗的(de)(de),下(xia)面公(gong)開一個失敗的(de)(de)代碼(ma),如果大家(jia)有解決(jue)方案,歡(huan)迎留言!
public void Update(IEnumerable<TEntity> item) { var list = new List<WriteModel<TEntity>>(); foreach (var iitem in item) { var query = new QueryDocument("_id", new ObjectId(typeof(TEntity).GetProperty(EntityKey).GetValue(iitem).ToString())); list.Add(new UpdateOneModel<TEntity>(query, Builders<TEntity>.Update.Combine(GeneratorMongoUpdate(iitem)))); } _table.BulkWriteAsync(list).Wait(); } public void Delete(IEnumerable<TEntity> item) { var list = new List<WriteModel<TEntity>>(); foreach (var iitem in item) { var query = new QueryDocument("_id", new ObjectId(typeof(TEntity).GetProperty(EntityKey).GetValue(iitem).ToString())); list.Add(new DeleteOneModel<TEntity>(query)); } _table.BulkWriteAsync(list).Wait(); }