diff --git a/Src/Asp.NetCore2/MongoDb.Ado.data/MongoDbDataReader.cs b/Src/Asp.NetCore2/MongoDb.Ado.data/MongoDbDataReader.cs index 3287e32ef..4d595afcc 100644 --- a/Src/Asp.NetCore2/MongoDb.Ado.data/MongoDbDataReader.cs +++ b/Src/Asp.NetCore2/MongoDb.Ado.data/MongoDbDataReader.cs @@ -54,7 +54,7 @@ namespace MongoDb.Ado.data // 返回IDataReader return table.CreateDataReader(); } - private static object ConvertBsonValue(BsonValue val) + public static object ConvertBsonValue(BsonValue val) { if (val == null || val.IsBsonNull) return DBNull.Value; diff --git a/Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryJsonArray.cs b/Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryJsonArray.cs index 2a4058262..d0e082143 100644 --- a/Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryJsonArray.cs +++ b/Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryJsonArray.cs @@ -34,7 +34,19 @@ namespace MongoDbTest var sid =ObjectId.GenerateNewId() + ""; db.Insertable(new IdsModel() {name="a", Ids =ids,Students=new List() { new Student(){ Id =sid} - } }).ExecuteCommand(); + } }).ExecuteCommand(); + db.Insertable(new IdsModel() + { + name = "b", + Ids = new List { ObjectId.GenerateNewId()+"" }, + Students = new List() { + new Student(){ Id =ObjectId.GenerateNewId()+""} + } + }).ExecuteCommand(); + var x = ids.Last(); + var list2=db.Queryable().Where(it => it.Ids.Contains(x)).ToList(); + if (list2.Count != 1) Cases.ThrowUnitError(); + if (!list2.First().Ids.Contains(x)) Cases.ThrowUnitError(); } [SqlSugar.SugarTable("UnitStudentdfsds3zzz1")] diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs index 1afbb2a68..d77aa9737 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs @@ -107,6 +107,14 @@ namespace SqlSugar.MongoDb { name = "ContainsArray"; } + else if (name == "Contains" && methodCallExpression.Arguments.Count == 1 + && methodCallExpression?.Object!=null + &&UtilMethods.IsCollectionOrArrayButNotByteArray(methodCallExpression.Object.Type) + && ExpressionTool.GetParameters(methodCallExpression?.Object).Count() >0 + && ExpressionTool.GetParameters(methodCallExpression.Arguments.FirstOrDefault()).Count == 0) + { + name = "JsonArrayAny"; + } return name; } } diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs index f39a4b593..b6847449c 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs @@ -566,7 +566,7 @@ namespace SqlSugar.MongoDb } - public override string IsNullOrEmpty(MethodCallExpressionModel model) + public override string IsNullOrEmpty(MethodCallExpressionModel model) { // 获取字段名表达式 var item = model.Args[0].MemberValue ?? model.DataObject; @@ -637,6 +637,31 @@ namespace SqlSugar.MongoDb return this.ContainsArray(model); } + public override string JsonArrayAny(MethodCallExpressionModel model) + { + // 伪代码步骤: + // 1. 获取数组字段表达式 arrayField + // 2. 获取要判断的元素表达式 pars + // 3. 解析字段名和元素值 + // 4. 构造 MongoDB $in 查询表达式:{ arrayField: { $in: [element] } } + // 5. 返回 JSON 字符串 + + var arrayFieldExpr = model.DataObject as Expression; + var elementExpr = model.Args[0].MemberValue as Expression; + + // 获取字段名 + BsonValue fieldName = new ExpressionVisitor(context).Visit(arrayFieldExpr); + // 获取元素值 + var elementValue = ExpressionTool.DynamicInvoke(elementExpr); + if (elementValue is string s&&UtilMethods.IsValidObjectId(s)) + { + elementValue = ObjectId.Parse(s); + } + // 构造 $in 查询表达式 + var inDoc = new BsonDocument(fieldName.ToString(), new BsonDocument("$in", new BsonArray { BsonValue.Create(elementValue) })); + return inDoc.ToJson(UtilMethods.GetJsonWriterSettings()); + } + #region Helper private static BsonValue GetMemberName(BsonValue memberName) { diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbInsertBuilder.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbInsertBuilder.cs index f65ca9403..7d3b1b739 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbInsertBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbInsertBuilder.cs @@ -1,4 +1,5 @@ -using MongoDB.Bson; +using MongoDb.Ado.data; +using MongoDB.Bson; using MongoDB.Bson.IO; using MongoDB.Bson.Serialization; using NetTaste; @@ -128,9 +129,17 @@ namespace SqlSugar.MongoDb // 5. 反序列化每一项 foreach (var item in bsonArray) { - var doc = item.AsBsonDocument; - var obj = BsonSerializer.Deserialize(doc, elementType); - resultList.Add(obj); + if (item is BsonDocument) + { + var doc = item.AsBsonDocument; + var obj = BsonSerializer.Deserialize(doc, elementType); + resultList.Add(obj); + } + else + { + var obj = MongoDbDataReaderHelper.ConvertBsonValue(item); + resultList.Add(obj); + } } return resultList; } diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs index 07476f1eb..43a3fd6f4 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs @@ -4,6 +4,7 @@ using MongoDB.Bson; using MongoDB.Bson.IO; using MongoDB.Bson.Serialization; using System; +using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; @@ -21,6 +22,22 @@ namespace SqlSugar.MongoDb { public class UtilMethods { + public static bool IsCollectionOrArrayButNotByteArray(Type type) + { + if (type == null) + return false; + + if (type == typeof(byte[])) + return false; + + if (type.IsArray) + return true; + + if (typeof(IEnumerable).IsAssignableFrom(type) && type != typeof(string)) + return true; + + return false; + } public static bool IsValidObjectId(string id) { return id != null && id.Length == 24 && ObjectId.TryParse(id, out _); @@ -110,7 +127,7 @@ namespace SqlSugar.MongoDb internal static MongoDB.Bson.IO.JsonWriterSettings GetJsonWriterSettings() { return new MongoDB.Bson.IO.JsonWriterSettings { }; - } + } internal static DateTime GetMinDate(ConnectionConfig currentConnectionConfig) { if (currentConnectionConfig.MoreSettings == null)