Update mongodb

This commit is contained in:
sunkaixuan
2025-08-24 13:10:32 +08:00
parent b365b445b6
commit 3bbee0aa3b
2 changed files with 31 additions and 4 deletions

View File

@@ -14,5 +14,6 @@ namespace SqlSugar.MongoDb
public ExpressionType NodeType { get; internal set; } public ExpressionType NodeType { get; internal set; }
public int LeftCount { get; internal set; } public int LeftCount { get; internal set; }
public int RightCount { get; internal set; } public int RightCount { get; internal set; }
public bool IsTwoMemeber { get; internal set; }
} }
} }

View File

@@ -9,6 +9,7 @@ using System.Reflection;
using MongoDB.Driver; using MongoDB.Driver;
using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using Dm.util;
namespace SqlSugar.MongoDb namespace SqlSugar.MongoDb
{ {
public class MethodCallExpressionTractor public class MethodCallExpressionTractor
@@ -171,6 +172,7 @@ namespace SqlSugar.MongoDb
private BsonValue CallAnyExpression(MethodCallExpression methodCall, AnyArgModel anyArgModel) private BsonValue CallAnyExpression(MethodCallExpression methodCall, AnyArgModel anyArgModel)
{ {
var nodeType = anyArgModel.NodeType;
// 获取集合字段名 // 获取集合字段名
var collectionField = MongoNestedTranslator.TranslateNoFieldName( var collectionField = MongoNestedTranslator.TranslateNoFieldName(
methodCall.Arguments[0], methodCall.Arguments[0],
@@ -215,18 +217,42 @@ namespace SqlSugar.MongoDb
); );
} }
// 映射表达式类型到Mongo操作符
string mongoOperator = nodeType switch
{
ExpressionType.Equal => "$eq",
ExpressionType.NotEqual => "$ne",
ExpressionType.GreaterThan => "$gt",
ExpressionType.GreaterThanOrEqual => "$gte",
ExpressionType.LessThan => "$lt",
ExpressionType.LessThanOrEqual => "$lte",
_ => "$eq"
};
if (leftExpr.Arguments.Any() && leftExpr.Arguments[0] is MemberExpression member && ExpressionTool.GetParameters(member).Count() > 0)
{
var leftMember = MongoNestedTranslator.TranslateNoFieldName(
member,
_context,
new ExpressionVisitorContext { IsText = true }
);
var leftMemberStr = UtilMethods.GetMemberName(leftMember.ToString()).ToString();
var newValue = "$$b." + leftMember.ToString();
leftValue = leftValue?.ToString().Replace(leftMemberStr, newValue);
leftValue = UtilMethods.ParseJsonObject(leftValue);
}
// 构造 $map // 构造 $map
var mapDoc = new BsonDocument var mapDoc = new BsonDocument
{ {
{ "input", $"${collectionField}" }, { "input", $"${collectionField}" },
{ "as", "b" }, { "as", "b" },
{ "in", leftValue } { "in", new BsonDocument(mongoOperator, new BsonArray { leftValue, rightValue }) }
}; };
// 构造 $expr/$in // 构造 $expr/$anyElementTrue
var exprDoc = new BsonDocument var exprDoc = new BsonDocument
{ {
{ "$in", new BsonArray { rightValue, new BsonDocument("$map", mapDoc) } } { "$anyElementTrue", new BsonDocument("$map", mapDoc) }
}; };
var bson = new BsonDocument var bson = new BsonDocument
@@ -585,7 +611,7 @@ namespace SqlSugar.MongoDb
var isleftCall = (anyArgModel.Left is MethodCallExpression) && anyArgModel.LeftCount >= 1; var isleftCall = (anyArgModel.Left is MethodCallExpression) && anyArgModel.LeftCount >= 1;
var isRightCall = !(anyArgModel.Right is MethodCallExpression) && anyArgModel.RightCount >= 1; var isRightCall = !(anyArgModel.Right is MethodCallExpression) && anyArgModel.RightCount >= 1;
var allCount = anyArgModel.LeftCount + anyArgModel.RightCount; var allCount = anyArgModel.LeftCount + anyArgModel.RightCount;
if ((isleftCall || isRightCall) && allCount == 1&&anyArgModel.NodeType.IsIn(ExpressionType.Equal,ExpressionType.NotEqual)) if ((isleftCall || isRightCall) && allCount == 1)
{ {
anyArgModel.Left = isleftCall? anyArgModel.Left:anyArgModel.Right; anyArgModel.Left = isleftCall? anyArgModel.Left:anyArgModel.Right;
anyArgModel.Right = isleftCall ? anyArgModel.Right: anyArgModel.Left; anyArgModel.Right = isleftCall ? anyArgModel.Right: anyArgModel.Left;