亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 137 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號