MongoDB學習筆記~批量插入方法的實現
阿新 • • 發佈:2018-12-30
批量插入在EF時代大叔就自己封裝過,原理是將多次SQL連線和多次向SQL傳送的指令減少到1次,或者1000條資料1次,而對於EF產生的語句來說,這無疑是效能高效的,因為EF這邊在處理時,每個語句都會向SQL傳送一次,當然就算它是在一個SQL連線裡,向SQL傳送N多條指令,也是效能低下的。
對於MongoDB來說也是一樣,如何減少與Mongo通訊的次數,是提高插入操作的前提,還好,官方驅動為我們繼承了這個功能,使用WriteModel型別來儲存要插入的集合,使用InsertOneModel型別來承載要插入的物件,這一切都很直觀,程式碼也很清晰!
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(); }
而測試完批量新增後,就做了批量更新和刪除,不過遺憾的是,都失敗的,下面公開一個失敗的程式碼,如果大家有解決方案,歡迎留言!
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(); }