Mongo C#驱动程序-是否支持长度?

时间:2019-07-13 09:35:53

标签: c# mongodb mongodb-.net-driver

docs说我可以使用:

Find(x => x.FavoriteNumbers.Length == 3);

如果我写:

await col.Find(f=>f.AuthType > 2).ToListAsync()

我确实得到了预期的结果,因为所有AuthType都大于2

enter image description here

但是,现在让我们说我想用Id.Length>2过滤所有记录:

await col.Find(f=>f.Id.Length>2).ToListAsync();

这将返回0条记录。

问题:

如何获取ID的长度> 2的所有记录?

我已经读过此question,但是没有答案,并且dup不在c#中

2 个答案:

答案 0 :(得分:2)

在Visual Studio中,您可以编写下面的代码行,然后尝试通过悬停检查它:

Select * from hive1.db1.table1 join hive2.db2.table2

发生的事情是MongoDB会将其转换为var query = await col.Find(f=>f.Str.Length>2) 之类的正则表达式,并且此正则表达式在数据库端执行。没什么意外的。当您将{find({ "Str" : /^.{3,}$/s })}更改为Str并将其转换为以下内容时,就会发生问题:

Id

,您的字段名称仍为{find({ "_id" : /^.{3,}$/s })} ,因此您没有任何结果。 here说明了发生这种情况的原因。因此,按照惯例,MongoDB驱动程序会推断应该将名为Id的字段转换为Id。要解决此问题,您可以使用_id属性在数据模型上明确指定应将哪个字段视为_id

BsonId

编辑:

要应用类型转换(int->字符串),您必须依靠MongoDB中引入的$toString运算符。这个想法很简单:您使用$addFields添加新字段,然后在其上运行$strLenCP来验证字符串长度。不幸的是,在C#中没有使用强类型化方法的简单方法,因此您可以使用public class ModelClass { [BsonId] public ObjectId RealId { get; set; } public string Id { get; set; } } 类,该类使您可以将字符串用作聚合管道定义:

BsonDocument

代码看起来很丑陋,但是它应该比运行普通JavaScript(更多here)更快。

答案 1 :(得分:0)

我已经做到了非常丑陋的方式,涉及到JS:

mysql = app.config["DB_CONN"];
            cur = mysql.connection.cursor();
            query = "Select url, app_name from oauth_clients where client_id=%s"
            args = (client_id,);
            cur.execute(query, args);
            row = cur.fetchone();
            url = row[0];
            appname = row[1];

enter image description here

什么是C#等效解决方案?