为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕无忌1623718 2023-08-13 14:07:39
我想使用 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                }            ]        }    ]}谢谢。
查看完整描述

1 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

要在 C# 驱动程序中构建聚合管道,您有 3 个选项。

  1. 您可以使用 LINQ 进行聚合,但 LINQ 和 Mongo 查询语言之间并不总是 1:1 映射。

  2. 您可以使用驱动程序特定的Builder类。

  3. 您可以使用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是我最好的猜测。


查看完整回答
反对 回复 2023-08-13
  • 1 回答
  • 0 关注
  • 101 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信