MongoDB C# 驱动程序 - Last SubDocument Field Eq to 'X' 的位置
Posted
技术标签:
【中文标题】MongoDB C# 驱动程序 - Last SubDocument Field Eq to \'X\' 的位置【英文标题】:MongoDB C# Driver - Where Last SubDocument Field Eq to 'X'MongoDB C# 驱动程序 - Last SubDocument Field Eq to 'X' 的位置 【发布时间】:2021-08-24 18:43:30 【问题描述】:我使用 MongoDB 作为我的数据库存储,从 SQL 到 Mongo 的查询适应性很好,尽管我不太了解如何实现简单的查询,例如:
过滤一个文档,其中子文档的最后一项将一个名为“退出”的字段设置为 true。例子:
Name: '',
Addresses:
[
Street: '',
IsDefault: true/false
,
Street: '',
IsDefault: true/false
,
Street: '',
IsDefault: true/false
]
结果应该是:
所有拥有最后一个地址“IsDefault”字段的人都设置为 true,并且只有那些人。
我在网上搜索过,但似乎很难找到解决办法。
如果有人可以给我一个提示,不胜感激。
谢谢
【问题讨论】:
【参考方案1】:您实际上并不需要 addFields 阶段。只需像这样运行比赛阶段:
db.Markets.aggregate(
[
$match:
$expr:
$eq: [ $last: "$Positions.ExitCompleted" , true]
])
不幸的是,afaik 没有强类型的方法将上述内容转换为 c# 驱动程序查询。
查看this article,了解运行此类高级查询的替代方法。
【讨论】:
非常感谢您指出这一点。干杯!【参考方案2】:嗯,
之后我做了一些研究,各种结果为我指明了一个方向。
我正在使用 MongoDB Compass,所以我在那里构建了聚合并提取到 C#。这可以使用:指南针>(选项卡上方 - 聚合)来完成。然后你选择你的阶段。我有以下阶段:
[$addFields:
lastExitCompleted:
$last: '$Positions.ExitCompleted'
, $match:
lastExitCompleted: true
]
然后我使用“将管道导出到语言”按钮导出到 C#(但是您可以导出到 Compass 支持的可用语言)。
之后我的 C# 聚合代码如下:
var addFieldsExpr = new BsonDocument("$addFields",
new BsonDocument("lastFieldValue",
new BsonDocument("$last", $"$nameof(MarketInfo.Positions).nameof(MarketInfoPosition.ExitCompleted)"))
);
var matchExpr = new BsonDocument("$match",
new BsonDocument("lastExitCompleted", exitCompleted) // exitCompleted is bool.
);
var markets = await (await db.Markets
.AggregateAsync(
PipelineDefinition<MarketInfo, MarketInfo>
.Create(addFieldsExpr, matchExpr) <-- this is what makes the job.
))
.ToListAsync();
return markets;
我们可以使用 nameof 来避免表达式中的拼写错误,因为我们没有强类型表达式。
我搜了一下,好像C# Driver不支持$addFields,如有错误请指教。
【讨论】:
以上是关于MongoDB C# 驱动程序 - Last SubDocument Field Eq to 'X' 的位置的主要内容,如果未能解决你的问题,请参考以下文章