1 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
要在 C# 驅(qū)動(dòng)程序中構(gòu)建聚合管道,您有 3 個(gè)選項(xiàng)。
您可以使用 LINQ 進(jìn)行聚合,但 LINQ 和 Mongo 查詢(xún)語(yǔ)言之間并不總是 1:1 映射。
您可以使用驅(qū)動(dòng)程序特定的
Builder
類(lèi)。您可以使用
BsonDocument
構(gòu)建器來(lái)構(gòu)建“原始”聚合。使用此方法的類(lèi)型安全性有限,或者沒(méi)有類(lèi)型安全性。
前兩個(gè)選項(xiàng)要求您創(chuàng)建適當(dāng)?shù)念?lèi),因?yàn)榫幾g器將強(qiáng)制執(zhí)行類(lèi)型安全。
您提供給選項(xiàng) 3 的聚合的“原始”轉(zhuǎn)換相當(dāng)簡(jiǎn)單,盡管有點(diǎn)冗長(zhǎng)。
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))))))));
不幸的是,由于我不知道你的輸入類(lèi)是什么樣的,所以我很難直接將你的管道轉(zhuǎn)換成代碼。然而,查看表達(dá)式文檔,它似乎$map
用于.Select
LINQ 并$filter
用于.Where
LINQ。這意味著,您的代碼看起來(lái)像
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)
? ? ? ? ? ? })
? ? ? ? });
因?yàn)槲覜](méi)有你的實(shí)際課程,所以我只能猜測(cè)它們是什么樣子,這StartObject是我最好的猜測(cè)。
- 1 回答
- 0 關(guān)注
- 133 瀏覽
添加回答
舉報(bào)