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' 的位置的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb c#过滤器使用和或运算符

MongoDB的C#驱动基本使用

从 C# 驱动程序执行 MongoDB Eval 函数(MongoDB 版本 2.4)

MongoDB - 使用 C# 驱动程序按日期和时间搜索

MongoDB C# Driver 快速入门

如何使用 C# 驱动程序更新 MongoDB 数组中的子文档