C# 投影中的 $map 和 $filter - 代码示例

我想使用 C# mongodb 驱动程序本机函数的聚合框架的 $map 和 $filter 选项。


有什么办法可以做到这一点吗?如果是的话,您可以提供一些代码示例吗?


我搜索了 Mongo DB 的官方文档,但没有找到任何结果。


以下代码位于 mongo shell 脚本中,我想转换为 C# mongodb 驱动程序。


var pipeline = 

[

    {

        $match:{

            ExId: {$in: [ObjectId('5d112f91cb865c02b0714d56'), ObjectId("5d168d2c305196e45e73f4a7")]}

        }

    },

    {

        $project:{

            ExId: 1,

            ArrayObject: {

                $map:{

                    'input': '$ArrayObject',

                    'as': 'itemA',

                    'in':{

                        'Name': '$$itemA.Name',

                        'FilterHere': {

                            $filter: {

                                input: '$$itemA.FilterHere',

                                as: 'item',

                                cond: {

                                    $eq: ['$$item.Sent', true]

                                }

                            }

                        }

                    }                        

                }

            }

        }

    }

]


db.getCollection('MyColection').aggregate(pipeline)

我期望将以下输出输出到 C# 对象中:


{

    "_id" : ObjectId("5d444527cb865d28e8572d8d"),

    "ExId" : ObjectId("5d112f91cb865c02b0714d56"),

    "ArrayObject" : [ 

        {

            "Name" : 130774,

            "FilterHere" : [ 

                {

                    "Code" : 15900181,

                    "SentDate" : ISODate("2019-08-02T11:13:11.732Z"),

                    "Sent" : true

                }, 

                {

                    "Code" : 15900184,

                    "SentDate" : ISODate("2019-08-02T11:13:11.735Z"),

                    "Sent" : true

                }

            ]

        }

    ]

}

谢谢。


慕无忌1623718
浏览 102回答 1
1回答

慕雪6442864

要在 C# 驱动程序中构建聚合管道,您有 3 个选项。您可以使用 LINQ 进行聚合,但 LINQ 和 Mongo 查询语言之间并不总是 1:1 映射。您可以使用驱动程序特定的Builder类。您可以使用BsonDocument构建器来构建“原始”聚合。使用此方法的类型安全性有限,或者没有类型安全性。前两个选项要求您创建适当的类,因为编译器将强制执行类型安全。您提供给选项 3 的聚合的“原始”转换相当简单,尽管有点冗长。var foo = new BsonDocument("$project",new BsonDocument("ExId", 1).Add("ArrayObject",    new BsonDocument("$map",        new BsonDocument("input", "$ArrayObject").Add("as", "itemA").Add("in",            new BsonDocument("Name", "$$itemA.Name").Add("$filter",                new BsonDocument("input", "$$itemA.FilterHere").Add("as", "item").Add("cond",                    new BsonDocument("$eq", new BsonArray().Add("$$item.Sent").Add(true))))))));不幸的是,由于我不知道你的输入类是什么样的,所以我很难直接将你的管道转换成代码。然而,查看表达式文档,它似乎$map用于.SelectLINQ 并$filter用于.WhereLINQ。这意味着,您的代码看起来像col.Aggregate().Match(doc => ids.Contains(doc.ExId)).Project(doc =>     new {        ExId = doc.ExId,        ArrayObject = doc.ArrayObject.Select(x =>            new            {                Name = x.Name,                FilterHere = x.FilterHere.Where(y => y.Sent == true)            })        });因为我没有你的实际课程,所以我只能猜测它们是什么样子,这StartObject是我最好的猜测。
打开App,查看更多内容
随时随地看视频慕课网APP