Update mongodb

This commit is contained in:
sunkaixuan
2025-06-14 13:38:49 +08:00
parent b7c6dac5a6
commit e5fbdfc60e
3 changed files with 74 additions and 4 deletions

View File

@@ -15,15 +15,28 @@ namespace MongoDbTest
internal static void Init()
{
var db = DBHelper.DbHelper.GetNewDb();
db.CodeFirst.InitTables<Student>(); ;
db.CodeFirst.InitTables<Student>();
db.DbMaintenance.TruncateTable<Student>();
var dt = DateTime.Now;
var studentId = db.Insertable(new Student() { CreateDateTime=dt, Name="a", SchoolId="aa" })
.ExecuteCommand();
var list=db.Queryable<Student>().Select(it => new
{
date=it.CreateDateTime.Date
date=it.CreateDateTime.Date,
year=it.CreateDateTime.Year,
day=it.CreateDateTime.Day,
hour=it.CreateDateTime.Hour,
Minute = it.CreateDateTime.Minute,
month=it.CreateDateTime.Month,
Second=it.CreateDateTime.Second
}).ToList();
if (list.First().date != dt.Date) Cases.ThrowUnitError();
if (list.First().year != dt.Date.Year) Cases.ThrowUnitError();
if (list.First().month != dt.Date.Month) Cases.ThrowUnitError();
if (list.First().day != dt.Date.Day) Cases.ThrowUnitError();
if (list.First().hour != dt.Hour) Cases.ThrowUnitError();
if (list.First().Minute != dt.Minute) Cases.ThrowUnitError();
if (list.First().Second != dt.Second) Cases.ThrowUnitError();
}
[SqlSugar.SugarTable("UnitStudent1231sds3z1")]
public class Student : MongoDbBase

View File

@@ -12,7 +12,16 @@ namespace SqlSugar.MongoDb
{
MongoNestedTranslatorContext _context;
ExpressionVisitorContext _visitorContext;
Dictionary<string, DateType> dateTypeNames = new Dictionary<string, DateType>
{
{ "Year", DateType.Year },
{ "Month", DateType.Month },
{ "Day", DateType.Day },
{ "Hour", DateType.Hour },
{ "Minute", DateType.Minute },
{ "Second", DateType.Second },
{ "Millisecond", DateType.Millisecond }
};
public FieldPathExtractor(MongoNestedTranslatorContext context, ExpressionVisitorContext visitorContext)
{
_context = context;
@@ -38,7 +47,12 @@ namespace SqlSugar.MongoDb
model.Args.Add(new MethodCallExpressionArgs() { MemberValue = memberExp.Expression });
return BsonDocument.Parse(method.ToDateShort(model));
}
else if (dateTypeNames.TryGetValue(memberExp.Member.Name, out var dateType))
{
model.Args.Add(new MethodCallExpressionArgs() { MemberValue = memberExp.Expression });
model.Args.Add(new MethodCallExpressionArgs() { MemberValue = dateType });
return BsonDocument.Parse(method.DateValue(model));
}
}
return ExtractFieldPath(expr);
}

View File

@@ -305,5 +305,48 @@ namespace SqlSugar.MongoDb
});
return dateTruncDoc.ToJson(UtilMethods.GetJsonWriterSettings());
}
public override string DateValue(MethodCallExpressionModel model)
{
var item = model.Args.First().MemberValue;
BsonValue itemValue = new ExpressionVisitor(context).Visit(item as Expression);
var dateType = (DateType)model.Args.Last().MemberValue;
switch (dateType)
{
case DateType.Year:
// MongoDB $year 操作符
return new BsonDocument("$year", $"${itemValue}").ToJson(UtilMethods.GetJsonWriterSettings());
case DateType.Month:
return new BsonDocument("$month", $"${itemValue}").ToJson(UtilMethods.GetJsonWriterSettings());
case DateType.Day:
return new BsonDocument("$dayOfMonth", $"${itemValue}").ToJson(UtilMethods.GetJsonWriterSettings());
case DateType.Hour:
return new BsonDocument("$hour", $"${itemValue}").ToJson(UtilMethods.GetJsonWriterSettings());
case DateType.Minute:
return new BsonDocument("$minute", $"${itemValue}").ToJson(UtilMethods.GetJsonWriterSettings());
case DateType.Second:
return new BsonDocument("$second", $"${itemValue}").ToJson(UtilMethods.GetJsonWriterSettings());
case DateType.Millisecond:
return new BsonDocument("$millisecond", $"${itemValue}").ToJson(UtilMethods.GetJsonWriterSettings());
case DateType.Weekday:
return new BsonDocument("$week", $"${itemValue}").ToJson(UtilMethods.GetJsonWriterSettings());
case DateType.Quarter:
// MongoDB 没有直接的quarter操作符需自定义表达式
var expr = new BsonDocument("$add", new BsonArray
{
new BsonDocument("$divide", new BsonArray
{
new BsonDocument("$subtract", new BsonArray
{
new BsonDocument("$month", $"${itemValue}"),
1
}),
3
}),
1
});
return expr.ToJson(UtilMethods.GetJsonWriterSettings());
}
return null;
}
}
}