如何在 C# 中使用管道 $lookup 和 let 参数 (MongoDB.Driver 2.7.2)
How to $lookup with pipeline & let parameters in C# (MongoDB.Driver 2.7.2)
我需要在我的 C# 代码中 运行 MongoDB 中的以下查询。我使用 MongoDB.Driver 2.7.2 和 MongoDB 4.0.
我想使用 $lookup 而不是 $project / $unwind 以防止命名集合的每个可能字段。
db.getCollection('Collection1').aggregate([
{ "$match" : { "Id" : 1 } },
{ "$lookup": {
"from": "Collection2",
"let": { collection1Id : "$Id" },
"pipeline": [
{ $match:
{ $expr:
{ $and:
[
{ $eq : [ "$Collection1Id", "$$collection2Id" ] },
{ $in : [ "$_id" , [1, 2, 3]] }
]
}
}
}
],
"as": "item"
}
}
])
我希望在多个连接条件下与 Collection2 连接的 Collection1 的输出。
由于您没有指定特定的 class 映射和示例文档,下面的答案将使用手册 $lookup: specify multiple join conditions with lookup
中的 BsonDocument
类型和示例数据
BsonArray subpipeline = new BsonArray();
subpipeline.Add(
new BsonDocument("$match",new BsonDocument(
"$expr", new BsonDocument(
"$and", new BsonArray {
new BsonDocument("$eq", new BsonArray{"$stock_item", "$$order_item"} ),
new BsonDocument("$gte", new BsonArray{"$instock", "$$order_qty"} )
}
)
))
);
var lookup = new BsonDocument("$lookup",
new BsonDocument("from", "warehouses")
.Add("let",
new BsonDocument("order_item", "$item")
.Add("order_qty", "$ordered"))
.Add("pipeline", subpipeline)
.Add("as", "stockdata")
);
var results = collection.Aggregate()
.Match(new BsonDocument("_id", 1))
.AppendStage<BsonDocument>(lookup).ToEnumerable();
foreach (var x in results)
{
Console.WriteLine(x.ToJson());
}
请注意支持更具表现力$lookup using PipelineDefinitionBuilder is coming for version 2.8.x. For more information see CSHARP-2013
我需要在我的 C# 代码中 运行 MongoDB 中的以下查询。我使用 MongoDB.Driver 2.7.2 和 MongoDB 4.0.
我想使用 $lookup 而不是 $project / $unwind 以防止命名集合的每个可能字段。
db.getCollection('Collection1').aggregate([
{ "$match" : { "Id" : 1 } },
{ "$lookup": {
"from": "Collection2",
"let": { collection1Id : "$Id" },
"pipeline": [
{ $match:
{ $expr:
{ $and:
[
{ $eq : [ "$Collection1Id", "$$collection2Id" ] },
{ $in : [ "$_id" , [1, 2, 3]] }
]
}
}
}
],
"as": "item"
}
}
])
我希望在多个连接条件下与 Collection2 连接的 Collection1 的输出。
由于您没有指定特定的 class 映射和示例文档,下面的答案将使用手册 $lookup: specify multiple join conditions with lookup
中的BsonDocument
类型和示例数据
BsonArray subpipeline = new BsonArray();
subpipeline.Add(
new BsonDocument("$match",new BsonDocument(
"$expr", new BsonDocument(
"$and", new BsonArray {
new BsonDocument("$eq", new BsonArray{"$stock_item", "$$order_item"} ),
new BsonDocument("$gte", new BsonArray{"$instock", "$$order_qty"} )
}
)
))
);
var lookup = new BsonDocument("$lookup",
new BsonDocument("from", "warehouses")
.Add("let",
new BsonDocument("order_item", "$item")
.Add("order_qty", "$ordered"))
.Add("pipeline", subpipeline)
.Add("as", "stockdata")
);
var results = collection.Aggregate()
.Match(new BsonDocument("_id", 1))
.AppendStage<BsonDocument>(lookup).ToEnumerable();
foreach (var x in results)
{
Console.WriteLine(x.ToJson());
}
请注意支持更具表现力$lookup using PipelineDefinitionBuilder is coming for version 2.8.x. For more information see CSHARP-2013