Update mongodb

This commit is contained in:
sunkaixuan
2025-06-29 14:26:00 +08:00
parent b060b98f33
commit 4a4cbcfea5
2 changed files with 57 additions and 22 deletions

View File

@@ -58,6 +58,20 @@ namespace MongoDbTest
.LeftJoin<School>((s, sc) => s.SchoolId == sc.Id) .LeftJoin<School>((s, sc) => s.SchoolId == sc.Id)
.Select((s, sc) => s).ToList(); .Select((s, sc) => s).ToList();
if (dt3.First().Name != "张三") Cases.ThrowUnitError(); if (dt3.First().Name != "张三") Cases.ThrowUnitError();
var dt5 = db.Queryable<Student>()
.LeftJoin<School>((s, sc) => s.SchoolId == sc.Id )
.Select((s, sc) => new {
studentName = s.Name,
schoolName = sc.Name
}).ToList();
var dt4 = db.Queryable<Student>()
.LeftJoin<School>((s, sc) => s.SchoolId.ToLower() == sc.Id.ToString())
.Select((s,sc)=>new {
studentName=s.Name,
schoolName=sc.Name
}).ToList();
if (dt3.First().Name != "张三") Cases.ThrowUnitError();
} }
[SqlSugar.SugarTable("UnitStudentdu2s31")] [SqlSugar.SugarTable("UnitStudentdu2s31")]
public class Student : MongoDbBase public class Student : MongoDbBase

View File

@@ -194,35 +194,34 @@ namespace SqlSugar.MongoDb
{ {
foreach (var item in this.JoinQueryInfos) foreach (var item in this.JoinQueryInfos)
{ {
// 解析 JoinWhere JSON假设格式为 { "SchoolId" : { "$eq" : "_id" } }
var joinWhereDoc = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(item.JoinWhere); var joinWhereDoc = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(item.JoinWhere);
// 只支持单字段等值连接 var isExp = joinWhereDoc.Contains("$expr");
var localField = joinWhereDoc.GetElement(0).Name; var localField = isExp ? string.Empty : joinWhereDoc.GetElement(0).Name;
var eqObj = joinWhereDoc[localField].AsBsonDocument; var eqObj = isExp ? null : joinWhereDoc[localField].AsBsonDocument;
var foreignField = eqObj.GetElement(0).Value.AsString; var foreignField = isExp ? string.Empty : eqObj.GetElement(0).Value.AsString;
// from: 目标集合名(假设 JoinQueryInfo 有 TableName/ShortName 字段,需根据实际情况调整)
// as: 关联后的别名(假设 JoinQueryInfo 有 ShortName 字段)
string from = item.TableName ?? item.ShortName ?? "Unknown"; string from = item.TableName ?? item.ShortName ?? "Unknown";
string asName = item.ShortName; string asName = item.ShortName;
var asNamePrefix = $"{asName}."; var asNamePrefix = $"{asName}.";
var isValueKey = foreignField.StartsWith(asNamePrefix) && !localField.StartsWith(asNamePrefix); var isValueKey = !isExp && foreignField.StartsWith(asNamePrefix) && !localField.StartsWith(asNamePrefix);
var isKeyValue = !foreignField.StartsWith(asNamePrefix) && localField.StartsWith(asNamePrefix); var isKeyValue = !isExp && !foreignField.StartsWith(asNamePrefix) && localField.StartsWith(asNamePrefix);
var isEasyJoin = isKeyValue || isValueKey; var isEasyJoin = isKeyValue || isValueKey;
if (isKeyValue) if (isKeyValue)
{ {
localField = localField.TrimStart(asNamePrefix.toCharArray()); localField = localField.TrimStart(asNamePrefix.ToCharArray());
var oldLocalField = localField; var oldLocalField = localField;
localField = foreignField; localField = foreignField;
foreignField = oldLocalField; foreignField = oldLocalField;
} }
else if(isValueKey) else if (isValueKey)
{ {
foreignField = foreignField.TrimStart(asNamePrefix.toCharArray()); foreignField = foreignField.TrimStart(asNamePrefix.ToCharArray());
} }
if (isEasyJoin) if (isEasyJoin)
{ {
// $lookup // $lookup 简单等值连接
var lookupDoc = new BsonDocument("$lookup", new BsonDocument var lookupDoc = new BsonDocument("$lookup", new BsonDocument
{ {
{ "from", from }, { "from", from },
@@ -232,28 +231,50 @@ namespace SqlSugar.MongoDb
}); });
operations.Add(lookupDoc.ToJson(UtilMethods.GetJsonWriterSettings())); operations.Add(lookupDoc.ToJson(UtilMethods.GetJsonWriterSettings()));
} }
else
{
// 解析$expr表达式
var exprDoc = joinWhereDoc.Contains("$expr") ? joinWhereDoc["$expr"] : joinWhereDoc;
// 构造let变量可扩展当前假设无变量
var letDoc = new BsonDocument();
// 构造pipeline
var pipelineArray = new BsonArray
{
new BsonDocument("$match", new BsonDocument("$expr", exprDoc))
};
var lookupDoc = new BsonDocument("$lookup", new BsonDocument
{
{ "from", from },
{ "let", letDoc },
{ "pipeline", pipelineArray },
{ "as", asName }
});
operations.Add(lookupDoc.ToJson(UtilMethods.GetJsonWriterSettings()));
}
// $unwind // $unwind
BsonValue unwindDoc = null; BsonValue unwindDoc = null;
if (item.JoinType == JoinType.Left) if (item.JoinType == JoinType.Left)
{ {
unwindDoc=new BsonDocument("$unwind", new BsonDocument unwindDoc = new BsonDocument("$unwind", new BsonDocument
{ {
{ "path", $"${asName}" }, { "path", $"${asName}" },
{ "preserveNullAndEmptyArrays", true } { "preserveNullAndEmptyArrays", true }
}); });
} }
else if(item.JoinType==JoinType.Inner) else if (item.JoinType == JoinType.Inner)
{ {
// InnerJoin: 不保留空数组和null
unwindDoc = new BsonDocument("$unwind", new BsonDocument unwindDoc = new BsonDocument("$unwind", new BsonDocument
{ {
{ "path", $"${asName}" } { "path", $"${asName}" }
}); });
} }
else else
{ {
throw new Exception(" No Support "+item.JoinType); throw new Exception(" No Support " + item.JoinType);
} }
operations.Add(unwindDoc.ToJson(UtilMethods.GetJsonWriterSettings())); operations.Add(unwindDoc.ToJson(UtilMethods.GetJsonWriterSettings()));
} }