【问题标题】:How to $lookup with pipeline & let parameters in C# (MongoDB.Driver 2.7.2)如何在 C# (MongoDB.Driver 2.7.2) 中使用管道进行 $lookup 和 let 参数
【发布时间】:2019-01-22 10:14:48
【问题描述】:

我需要在我的 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"
        }
    } 
])

我希望 Collection1 的输出在多个连接条件下与 Collection2 连接。

【问题讨论】:

    标签: c# mongodb mongodb-.net-driver


    【解决方案1】:

    由于您没有指定特定的类映射和示例文档,下面的答案将使用手册中的BsonDocument 类型和示例数据$lookup: specify multiple join conditions with lookup

    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());
    } 
    

    请注意,2.8.x 版即将支持使用 PipelineDefinitionBuilder 表达更丰富的 $lookup。欲了解更多信息,请参阅CSHARP-2013

    【讨论】:

    • 我很高兴这即将推出。谢谢你的回答!
    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 2019-10-24
    • 2020-07-12
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多