如何使用 MongoDB C# 驱动程序进行 $lookup?

How to $lookup with MongoDB C# driver?

如何使用 MongoDB C# 驱动程序执行 $lookup?我在他们的驱动程序文档中找不到它:

https://docs.mongodb.org/getting-started/csharp/query/

但如果我在他们的JIRA中正确理解这张票,它应该在2.2版本的驱动程序中:

https://jira.mongodb.org/browse/CSHARP-1374

如果您在 IMongoCollection 上使用 AsQueryable() 扩展方法,则可以使用 LINQ 接口作为示例。

var query = from p in collection.AsQueryable()
            join o in otherCollection on p.Name equals o.Key into joined
            select new { p.Name, AgeSum: joined.Sum(x => x.Age) };

这是从 mongodb csharp 驱动程序文档中复制的 http://mongodb.github.io/mongo-csharp-driver/2.2/reference/driver/crud/linq/#lookup

您也可以使用 collection.Aggregate().Lookup() 方法或将查找添加到聚合阶段来实现。

collection.Aggregate()
    .Lookup("foreignCollectionName", "localFieldName", "foreignFieldName", "result");

问题是查找需要投影

Collection.Aggregate().Lookup("foreignCollectionName", "localFieldName", "foreignFieldName","result").Project(Builders<BsonDocument>.Projection.Exclude("_id"))
.ToList()

然后你需要它转换成JSON

String ConvertToJson= res[0].AsBsonDocument.ToJson();
String resultsConvertToJson = ConvertToJson.ToJson();

然后使用BSONSerialize,放入C#强类型集合

List<TModel> results= BsonSerializer.Deserialize<List<TMModel>>(resultsConvertToJson);

这对我有用:

var collection2 = database.GetCollection<BsonDocument>("dbACESSO");

var match1 = new BsonDocument("$match", new BsonDocument("PartnerId", cliente));
var match2 = new BsonDocument("$match", new BsonDocument("CD_CLIENTE", codCond));

var lookup1 = new BsonDocument { { "$lookup", new BsonDocument { { "from", "GRUPO_UNIDADE" }, { "localField", "CD_GRUPO_UNIDADE" }, { "foreignField", "CD_GRUPO_UNIDADE" }, { "as", "GRUPO" } } } };

var pipeline = new[] { match1, match2, lookup1 };
var result = collection2.Aggregate<BsonDocument>(pipeline).ToList();

除了那些人已经提到的以外,还有一个类型安全的重载可用于您可以使用的查找方法。

Lookup是本地集合的扩展方法,接受4个参数,第一个是外部集合,第二个是本地字段的表达式,第三个是外部字段的表达式,第四个是一个将联接结果映射到输出类型中的字段的表达式。

_fromTypeCollection.Aggregate<fromType>()
.Lookup<fromType,targetType,outputType>(targetTypeCollection,
fromType => fromType.localFeild, 
targetType => targetType.foreignField, 
outputType => outputType.result);