docs说我可以使用:
Find(x => x.FavoriteNumbers.Length == 3);
如果我写:
await col.Find(f=>f.AuthType > 2).ToListAsync()
我确实得到了预期的结果,因为所有AuthType
都大于2
。
但是,现在让我们说我想用Id.Length>2
过滤所有记录:
await col.Find(f=>f.Id.Length>2).ToListAsync();
这将返回0条记录。
问题:
如何获取ID的长度> 2的所有记录?
我已经读过此question,但是没有答案,并且dup不在c#中
答案 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)