Update mongodb

This commit is contained in:
sunkaixuan 2025-06-12 18:33:49 +08:00
parent f5b0319b5d
commit 62498438f5
4 changed files with 79 additions and 9 deletions

View File

@ -9,17 +9,54 @@ namespace MongoDbTest
{
public class QueryWhere
{
public static void Init()
public static void Init()
{
var db = DBHelper.DbHelper.GetNewDb();
db.CodeFirst.InitTables<Student>();
db.DbMaintenance.TruncateTable<Student>();
db.Insertable(new Student() { Name = "jack",Bool=true, SchoolId =2 }).ExecuteCommand();
db.Insertable(new Student() { Name = "tom_null", Bool = false,BoolNull=true, SchoolId =3 ,SchoolIdNull=4}).ExecuteCommand();
var list=db.Queryable<Student>().ToList();
//创建DB
var db = DBHelper.DbHelper.GetNewDb();
//初始化数据
InitializeStudentData(db);
//null类型测试
ValidateStudentData(db);
//函数
FilterStudentsByFunc(db);
//根据bool过滤
FilterStudentsByBool(db);
}
private static void FilterStudentsByBool(SqlSugar.SqlSugarClient db)
{
//bool类型测试
var list1 = db.Queryable<Student>().Where(it => it.Bool == true).ToList();
//var list2 = db.Queryable<Student>().Where(it => it.Bool).ToList();
//var list3 = db.Queryable<Student>().Where(it => !it.Bool).ToList();
}
private static void FilterStudentsByFunc(SqlSugar.SqlSugarClient db)
{
var list = db.Queryable<Student>().Where(it => it.Name.Contains("ck")).ToList();
if (!list.First().Name.Contains("ck")) Cases.ThrowUnitError();
}
private static void ValidateStudentData(SqlSugar.SqlSugarClient db)
{
var list = db.Queryable<Student>().ToList();
if (list.First() is { } first && (first.BoolNull != null || first.SchoolIdNull != null)) Cases.ThrowUnitError();
if (list.Last() is { } last && (last.BoolNull != true || last.SchoolIdNull != 4)) Cases.ThrowUnitError();
}
private static void InitializeStudentData(SqlSugar.SqlSugarClient db)
{
db.CodeFirst.InitTables<Student>();
db.DbMaintenance.TruncateTable<Student>();
db.Insertable(new Student() { Name = "jack", Bool = true, SchoolId = 2 }).ExecuteCommand();
db.Insertable(new Student() { Name = "tom_null", Bool = false, BoolNull = true, SchoolId = 3, SchoolIdNull = 4 }).ExecuteCommand();
}
[SqlSugar.SugarTable("UnitStudent1ssss23s131")]
public class Student : MongoDbBase
{

View File

@ -32,6 +32,7 @@ namespace SqlSugar.MongoDb
MethodCallExpressionModel model = new MethodCallExpressionModel();
var args= methodCallExpression.Arguments;
model.Args = new List<MethodCallExpressionArgs>();
model.DataObject = methodCallExpression.Object;
foreach (var item in args)
{
model.Args.Add(new MethodCallExpressionArgs() { MemberValue = item });

View File

@ -239,6 +239,23 @@ namespace SqlSugar.MongoDb
context.queryBuilder.GroupByValue += $"({UtilConstants.ReplaceCommaKey}({result}){UtilConstants.ReplaceCommaKey})";
context.queryBuilder.LambdaExpressions.Index++;
return name;
}
public override string Contains(MethodCallExpressionModel model)
{
var item = model.Args.First().MemberValue;
BsonValue right = new ExpressionVisitor(context).Visit(item as Expression);
BsonValue left = new ExpressionVisitor(context).Visit(model.DataObject as Expression);
// 构造 $regex 匹配
var regexDoc = new BsonDocument
{
{ "$regex", right }, // right 是普通字符串值,例如 "a"
{ "$options", "i" } // 忽略大小写
};
var match = new BsonDocument("$match", new BsonDocument
{
{ left.ToString(), regexDoc }
});
return match.ToJson(UtilMethods.GetJsonWriterSettings());
}
}
}

View File

@ -64,8 +64,17 @@ namespace SqlSugar.MongoDb
trimmed = trimmed.Substring(5).TrimStart();
else if (trimmed.StartsWith("AND", StringComparison.OrdinalIgnoreCase))
trimmed = trimmed.Substring(3).TrimStart();
// item 是 JSON 格式字符串,直接包进 $match
operations.Add($"{{ \"$match\": {trimmed} }}");
if (IsFieldNameJson(trimmed))
{
var outerDoc = BsonDocument.Parse(trimmed);
trimmed = outerDoc["fieldName"].AsString;
operations.Add(trimmed);
}
else
{
// item 是 JSON 格式字符串,直接包进 $match
operations.Add($"{{ \"$match\": {trimmed} }}");
}
}
#endregion
@ -192,6 +201,12 @@ namespace SqlSugar.MongoDb
return sb.ToString();
}
private bool IsFieldNameJson(string trimmed)
{
return trimmed.StartsWith("{ \"fieldName\" : ");
}
public override string ToCountSql(string sql)
{
sql=sql.TrimEnd(']');