From 155110908d2d32fa7f755951d4be709f2e07e986 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Mon, 23 Jun 2025 19:19:15 +0800 Subject: [PATCH] Update mongodb --- .../MongoDbTest/UnitTest/Cases.cs | 1 + .../MongoDbTest/UnitTest/QueryJson.cs | 48 ++++++++++++++ .../SqlBuilder/MongoDbDeleteBuilder.cs | 5 +- .../SqlBuilder/MongoDbExpressionContext.cs | 5 +- .../SqlBuilder/MongoDbInsertBuilder.cs | 63 +++++++++++++++++-- .../SqlBuilder/MongoDbUpdateBuilder.cs | 5 +- .../SqlSugar.MongoDbCore/Tools/UtilMethods.cs | 5 +- 7 files changed, 110 insertions(+), 22 deletions(-) create mode 100644 Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryJson.cs diff --git a/Src/Asp.NetCore2/MongoDbTest/UnitTest/Cases.cs b/Src/Asp.NetCore2/MongoDbTest/UnitTest/Cases.cs index de934ddd6..cf02a30bc 100644 --- a/Src/Asp.NetCore2/MongoDbTest/UnitTest/Cases.cs +++ b/Src/Asp.NetCore2/MongoDbTest/UnitTest/Cases.cs @@ -14,6 +14,7 @@ namespace MongoDbTest QuerySingle.Init(); QueryWhere.Init(); QuerySelect.Init(); + QueryJson.Init(); Insert.Init(); Update.Init(); Delete.Init(); diff --git a/Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryJson.cs b/Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryJson.cs new file mode 100644 index 000000000..ab620dd2f --- /dev/null +++ b/Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryJson.cs @@ -0,0 +1,48 @@ +using SqlSugar.MongoDb; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MongoDbTest +{ + public class QueryJson + { + internal static void Init() + { + var db = DBHelper.DbHelper.GetNewDb(); + db.CodeFirst.InitTables(); + db.DbMaintenance.TruncateTable(); + db.Insertable(new Book() { Price = 1, CreateTime = DateTime.Now }).ExecuteCommand(); + var data1=db.Queryable().Where(it => it.Price == 1).ToList(); + db.Insertable(new Student() { Age = 1, Name = "tom", SchoolId = "a", Book = new Book() { CreateTime = DateTime.Now, Price = 1 } }).ExecuteCommand(); + db.Insertable(new Student() { Age = 1, Name = "tom2", SchoolId = "a2", Book = new Book() { CreateTime = DateTime.Now, Price = 2 } }).ExecuteCommand(); + var data2 = db.Queryable().Where(it => it.Book.Price == 1).ToList(); + if (data2.Count != 1) Cases.ThrowUnitError(); + if (data2.First().Book.Price != 1) Cases.ThrowUnitError(); + } + + [SqlSugar.SugarTable("UnitStudentdfsds3zzz1")] + public class Student : MongoDbBase + { + public string Name { get; set; } + + public string SchoolId { get; set; } + + public int Age { get; set; } + + public DateTime CreateDateTime { get; set; } + + [SqlSugar.SugarColumn(IsJson = true)] + public Book Book { get; set; } + } + + public class Book + { + public decimal Price { get; set; } + public DateTime CreateTime { get; set; } + } + } + +} diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbDeleteBuilder.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbDeleteBuilder.cs index 7678e7b29..8c5da6c0f 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbDeleteBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbDeleteBuilder.cs @@ -43,10 +43,7 @@ namespace SqlSugar.MongoDb { "_id", new BsonDocument { { "$in", bsonArray } } } }; - string json = filter.ToJson(new MongoDB.Bson.IO.JsonWriterSettings - { - OutputMode = MongoDB.Bson.IO.JsonOutputMode.Shell - }); // 使用 MongoDB 驱动的序列化 + string json = filter.ToJson(UtilMethods.GetJsonWriterSettings()); // 使用 MongoDB 驱动的序列化 jsonObjects.Add(json); } } diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs index e04c6cc41..16b8bb8a6 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs @@ -17,10 +17,7 @@ namespace SqlSugar.MongoDb context.context = this.SugarContext.Context; context.queryBuilder = this.SugarContext.QueryBuilder; var sql=MongoNestedTranslator.Translate(expression, context); - var shellString = sql.ToJson(new JsonWriterSettings - { - OutputMode = JsonOutputMode.Shell - }); + var shellString = sql.ToJson(UtilMethods.GetJsonWriterSettings()); this.Result.Append(shellString); } diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbInsertBuilder.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbInsertBuilder.cs index e94ffe077..a7fbf76de 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbInsertBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbInsertBuilder.cs @@ -1,5 +1,9 @@ using MongoDB.Bson; +using MongoDB.Bson.IO; +using MongoDB.Bson.Serialization; +using NetTaste; using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; @@ -10,6 +14,49 @@ namespace SqlSugar.MongoDb { public class MongoDbInsertBuilder : InsertBuilder { + public MongoDbInsertBuilder() + { + this.SerializeObjectFunc = it => + { + object value =it; + + if (value is IEnumerable enumerable) + { + var realType = value.GetType(); + var bson = value.ToBson(realType); + var json = bson.ToJson(UtilMethods.GetJsonWriterSettings()); + return json; + } + else + { + var realType = it.GetType(); + var bson = it.ToBson(realType); // → byte[] + var doc = BsonSerializer.Deserialize(bson); // → BsonDocument + var json = doc.ToJson(UtilMethods.GetJsonWriterSettings()); + return json; + } + }; + this.DeserializeObjectFunc = (json, type) => + { + if (json is Dictionary keyValues) + { + // 先用 Dictionary 构建 BsonDocument + var bsonDoc = new BsonDocument(); + + foreach (var kvp in keyValues) + { + bsonDoc.Add(kvp.Key, BsonValue.Create(kvp.Value)); + } + + // 再用 BsonSerializer 反序列化为 T + return BsonSerializer.Deserialize(bsonDoc, type); + } + else + { + return null; + } + }; + } public override string SqlTemplate { get @@ -39,7 +86,7 @@ namespace SqlSugar.MongoDb public override Func ConvertInsertReturnIdFunc { get; set; } = (name, sql) => { return sql.Trim().TrimEnd(';')+ $"returning {name} "; - }; + }; public override string ToSqlString() { var sql= BuildInsertMany(this.DbColumnInfoList, this.EntityInfo.DbTableName); @@ -59,14 +106,18 @@ namespace SqlSugar.MongoDb foreach (var col in group) { // 自动推断类型,如 string、int、bool、DateTime、ObjectId 等 - doc[col.DbColumnName] = UtilMethods.MyCreate(col.Value); + if (col.IsJson == true) + { + doc[col.DbColumnName] = BsonDocument.Parse(col.Value?.ToString()); + } + else + { + doc[col.DbColumnName] = UtilMethods.MyCreate(col.Value); + } } // 转为 JSON 字符串(标准 MongoDB shell 格式) - string json = doc.ToJson(new MongoDB.Bson.IO.JsonWriterSettings - { - OutputMode = MongoDB.Bson.IO.JsonOutputMode.Shell // 可改成 Strict - }); + string json = doc.ToJson(UtilMethods.GetJsonWriterSettings()); jsonObjects.Add(json); } diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbUpdateBuilder.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbUpdateBuilder.cs index b083c0d8b..bb1c3db64 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbUpdateBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbUpdateBuilder.cs @@ -137,10 +137,7 @@ namespace SqlSugar.MongoDb { "update", update } }; - string json = entry.ToJson(new MongoDB.Bson.IO.JsonWriterSettings - { - OutputMode = MongoDB.Bson.IO.JsonOutputMode.Shell // JSON标准格式,带双引号 - }); + string json = entry.ToJson(UtilMethods.GetJsonWriterSettings()); operations.Add(json); } diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs index eb6faf8a3..25f0ac673 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs @@ -28,10 +28,7 @@ namespace SqlSugar.MongoDb } internal static MongoDB.Bson.IO.JsonWriterSettings GetJsonWriterSettings() { - return new MongoDB.Bson.IO.JsonWriterSettings - { - OutputMode = MongoDB.Bson.IO.JsonOutputMode.Shell // JSON标准格式,带双引号 - }; + return new MongoDB.Bson.IO.JsonWriterSettings { }; } internal static DateTime GetMinDate(ConnectionConfig currentConnectionConfig) {