Update MongoDb

This commit is contained in:
sunkaixuan
2025-05-10 10:20:35 +08:00
parent 8285641274
commit dc6a3086ca
3 changed files with 74 additions and 21 deletions

View File

@@ -56,6 +56,18 @@ namespace MongoDbTest
.ExecuteCommand();
var updateRow6 = db.Updateable<OrderInfo>()
.SetColumns(it => new OrderInfo { Name = it.Name, CreateTime = DateTime.Now })
.Where(it => it.Id == ids.Last())
.ExecuteCommand();
var updateRow7 = db.Updateable<OrderInfo>()
.SetColumns(it => new OrderInfo { Name = it.Name+"a", CreateTime = DateTime.Now })
.Where(it => it.Id == ids.Last())
.ExecuteCommand();
var delrow = db.Deleteable(new OrderInfo() { Id = ids.Last() })
.ExecuteCommand();

View File

@@ -56,14 +56,29 @@ namespace SqlSugar.MongoDbCore
}
private BsonDocument FieldComparisonExpression(BinaryExpression expr)
{
BsonValue field, value;
bool leftIsMember, rightIsMember;
string op;
OutParameters(expr, out field, out value, out leftIsMember, out rightIsMember, out op);
if (op == null)
{
return GetCalculationOperation(field, expr.NodeType, value);
}
else
{
return GetComparisonOperation(expr, field, value, leftIsMember, rightIsMember, op);
}
}
private void OutParameters(BinaryExpression expr, out BsonValue field, out BsonValue value, out bool leftIsMember, out bool rightIsMember, out string op)
{
var left = new ExpressionVisitor(_context, new ExpressionVisitorContext());
var right = new ExpressionVisitor(_context, new ExpressionVisitorContext());
BsonValue field = left.Visit(expr.Left);
BsonValue value = right.Visit(expr.Right);
bool leftIsMember = false;
bool rightIsMember = false;
field = left.Visit(expr.Left);
value = right.Visit(expr.Right);
leftIsMember = false;
rightIsMember = false;
if (left?.visitorContext?.ExpType == typeof(MemberExpression))
{
leftIsMember = true;
@@ -74,7 +89,7 @@ namespace SqlSugar.MongoDbCore
rightIsMember = true;
}
string op = expr.NodeType switch
op = expr.NodeType switch
{
ExpressionType.Equal => "$eq",
ExpressionType.NotEqual => "$ne",
@@ -82,14 +97,15 @@ namespace SqlSugar.MongoDbCore
ExpressionType.GreaterThanOrEqual => "$gte",
ExpressionType.LessThan => "$lt",
ExpressionType.LessThanOrEqual => "$lte",
_ => throw new NotSupportedException($"Unsupported binary op: {expr.NodeType}")
_ => null
};
}
private BsonDocument GetComparisonOperation(BinaryExpression expr, BsonValue field, BsonValue value, bool leftIsMember, bool rightIsMember, string op)
{
string leftValue = "";
BsonValue rightValue = "";
if (IsLeftValue(leftIsMember, rightIsMember, op)|| IsRightValue(leftIsMember, rightIsMember, op))
if (IsLeftValue(leftIsMember, rightIsMember, op) || IsRightValue(leftIsMember, rightIsMember, op))
{
MemberExpression expression;
if (IsLeftValue(leftIsMember, rightIsMember, op))
@@ -134,6 +150,24 @@ namespace SqlSugar.MongoDbCore
}
}
private BsonDocument GetCalculationOperation(BsonValue field, ExpressionType nodeType, BsonValue value)
{
string operation = nodeType switch
{
ExpressionType.Add => "$add",
ExpressionType.Subtract => "$subtract",
ExpressionType.Multiply => "$multiply",
ExpressionType.Divide => "$divide",
ExpressionType.Modulo => "$mod",
_ => throw new NotSupportedException($"Unsupported calculation operation: {nodeType}")
};
return new BsonDocument
{
{ field.ToString(), new BsonDocument { { operation, value } } }
};
}
private static bool IsRightValue(bool leftIsMember, bool rightIsMember, string op)
{
return rightIsMember && !leftIsMember;

View File

@@ -26,7 +26,7 @@ namespace SqlSugar.MongoDbCore
throw new Exception("");
}
private static BsonValue Update(Expression expr)
private BsonValue Update(Expression expr)
{
var exp = expr as MemberInitExpression;
var setDocument = new BsonDocument();
@@ -35,10 +35,17 @@ namespace SqlSugar.MongoDbCore
if (binding is MemberAssignment assignment)
{
var fieldName = assignment.Member.Name;
var fieldValue = Expression.Lambda(assignment.Expression).Compile().DynamicInvoke();
var fieldValue =new ExpressionVisitor(_context,_visitorContext).Visit(Expression.Lambda(assignment.Expression));
if (assignment.Expression is MemberExpression && ExpressionTool.GetParameters(assignment.Expression).Count > 0)
{
setDocument[fieldName] = new BsonDocument("$getField", fieldValue);
}
else
{
setDocument[fieldName] = BsonValue.Create(fieldValue);
}
}
}
return new BsonDocument("$set", setDocument);
}
}