From d281857b5503d485294b5ea531f35eecd70a393f Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sun, 22 Jun 2025 10:44:05 +0800 Subject: [PATCH] Update mongodb --- .../ExecuteNonQueryItems/BulkWriteHandler.cs | 40 ++++++++++++++++++ .../ExecuteHandlerFactory.cs | 1 + .../BulkWriteHandlerAsync.cs | 42 +++++++++++++++++++ .../ExecuteHandlerFactoryAsync.cs | 1 + .../MongoDbTest/UnitTest/Update.cs | 2 +- .../SqlBuilder/MongoDbUpdateBuilder.cs | 2 +- 6 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItems/BulkWriteHandler.cs create mode 100644 Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItemsAsync/BulkWriteHandlerAsync.cs diff --git a/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItems/BulkWriteHandler.cs b/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItems/BulkWriteHandler.cs new file mode 100644 index 000000000..58478537f --- /dev/null +++ b/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItems/BulkWriteHandler.cs @@ -0,0 +1,40 @@ +using MongoDB.Bson.Serialization; +using MongoDB.Bson; +using MongoDB.Driver; +using System; +using System.Collections.Generic; +using System.Text; + +namespace MongoDb.Ado.data +{ + public class BulkWriteHandler : IMongoOperationHandler + { + public HandlerContext context { get; set; } + public string operation { get; set; } + public int Handle(IMongoCollection collection, string json) + { + var documents = ParseJsonArray(json); + var bulkOps = new List>(); + + foreach (var doc in documents) + { + var filter = doc["filter"].AsBsonDocument; + var update = doc["update"].AsBsonDocument; + + var op = new UpdateManyModel(filter, update); + bulkOps.Add(op); + } + + var result = collection.BulkWrite(bulkOps); + return (int)result.ModifiedCount; + } + + private List ParseJsonArray(string json) + { + if (json.TrimStart().StartsWith("[")) + return BsonSerializer.Deserialize>(json); + return new List { BsonDocument.Parse(json) }; + } + } + +} diff --git a/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItems/ExecuteHandlerFactory.cs b/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItems/ExecuteHandlerFactory.cs index 87db74aa3..ade8ffb40 100644 --- a/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItems/ExecuteHandlerFactory.cs +++ b/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItems/ExecuteHandlerFactory.cs @@ -15,6 +15,7 @@ namespace MongoDb.Ado.data { "insertmany", new InsertManyHandler() }, { "update", new UpdateHandler() }, { "updatemany", new UpdateManyHandler() }, + { "BulkWrite", new BulkWriteHandler() }, { "delete", new DeleteHandler() }, { "deletemany", new DeleteManyHandler() }, { "find", new NonFindHandler() } diff --git a/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItemsAsync/BulkWriteHandlerAsync.cs b/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItemsAsync/BulkWriteHandlerAsync.cs new file mode 100644 index 000000000..21048e830 --- /dev/null +++ b/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItemsAsync/BulkWriteHandlerAsync.cs @@ -0,0 +1,42 @@ +using MongoDB.Bson.Serialization; +using MongoDB.Bson; +using MongoDB.Driver; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using System.Threading; + +namespace MongoDb.Ado.data +{ + public class BulkWriteHandlerAsync : IMongoOperationHandlerAsync + { + public CancellationToken token { get; set; } + public string operation { get; set; } + public async Task HandleAsync(IMongoCollection collection, string json) + { + var documents = ParseJsonArray(json); + var bulkOps = new List>(); + + foreach (var doc in documents) + { + var filter = doc["filter"].AsBsonDocument; + var update = doc["update"].AsBsonDocument; + + var op = new UpdateManyModel(filter, update); + bulkOps.Add(op); + } + + var result =await collection.BulkWriteAsync(bulkOps); + return (int)result.ModifiedCount; + } + + private List ParseJsonArray(string json) + { + if (json.TrimStart().StartsWith("[")) + return BsonSerializer.Deserialize>(json); + return new List { BsonDocument.Parse(json) }; + } + } + +} diff --git a/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItemsAsync/ExecuteHandlerFactoryAsync.cs b/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItemsAsync/ExecuteHandlerFactoryAsync.cs index acff1890e..f4d37bc89 100644 --- a/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItemsAsync/ExecuteHandlerFactoryAsync.cs +++ b/Src/Asp.NetCore2/MongoDb.Ado.data/ExecuteNonQueryItemsAsync/ExecuteHandlerFactoryAsync.cs @@ -17,6 +17,7 @@ namespace MongoDb.Ado.data { "insertmany", new InsertManyHandlerAsync() }, { "update", new UpdateHandlerAsync() }, { "updatemany", new UpdateManyHandlerAsync() }, + { "BulkWrite", new BulkWriteHandlerAsync() }, { "delete", new DeleteHandlerAsync() }, { "deletemany", new DeleteManyHandlerAsync() }, { "find", new NonFindHandlerAsync() } diff --git a/Src/Asp.NetCore2/MongoDbTest/UnitTest/Update.cs b/Src/Asp.NetCore2/MongoDbTest/UnitTest/Update.cs index b193a7bb3..3969868cc 100644 --- a/Src/Asp.NetCore2/MongoDbTest/UnitTest/Update.cs +++ b/Src/Asp.NetCore2/MongoDbTest/UnitTest/Update.cs @@ -62,7 +62,7 @@ namespace MongoDbTest } ).WhereColumns(it =>new { it.Name,it.Age }).ExecuteCommand(); var list5 = db.Queryable().Where(it => it.SchoolId == "3").ToList(); - if(list5.Count!=1|| list5.First().Name!="yy") Cases.ThrowUnitError(); ; + if(list5.Count!=1|| list5.First().Name!="yy") Cases.ThrowUnitError(); } [SqlSugar.SugarTable("UnitStudentdghhuesd3z1")] public class Student : MongoDbBase diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbUpdateBuilder.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbUpdateBuilder.cs index 30028819d..b083c0d8b 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbUpdateBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbUpdateBuilder.cs @@ -76,7 +76,7 @@ namespace SqlSugar.MongoDb UpdateByObject(groupList, operations, pks); } var sb = new StringBuilder(); - sb.Append($"updateMany {tableName} [ "); + sb.Append($"BulkWrite {tableName} [ "); sb.Append(string.Join(", ", operations)); sb.Append(" ]");