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

Mongo C# driver - Length support?

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();

这returns条记录。

问题:

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

我已经读过这个 question ,但没有答案,而且 dup 不在 c#

我设法以一种非常丑陋的方式做到了,涉及 JS:

var ll=new BsonDocument("$where", new BsonJavaScript("function() { return this.authType.toString().length>2; }"));

var t2 = await col.Find(ll).ToListAsync();

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

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

var query = await col.Find(f=>f.Str.Length>2)

发生的事情是 MongoDB 将其转换为 {find({ "Str" : /^.{3,}$/s })} 之类的正则表达式,并且此正则表达式在数据库端执行。没什么意外的。当您将 Str 更改为 Id 时会出现问题,后者会被翻译成:

{find({ "_id" : /^.{3,}$/s })}

并且您没有得到任何结果,因为您的字段名称仍然是 Id。它发生的原因已描述 here。所以 MongoDB 驱动程序按照惯例推断名为 Id 的字段应该被翻译成 _id。要解决此问题,您可以使用 BsonId 属性在数据模型上明确指定应将哪个字段视为 _id

public class ModelClass
{
    [BsonId]
    public ObjectId RealId { get; set; }
    public string Id { get; set; }
}

编辑:

要应用类型转换(int -> string),您必须依靠 $toString operator introduced in MongoDB. The idea is simple: you add new field using $addFields and then run $strLenCP 来验证字符串长度。不幸的是,在 C# 中使用强类型方式没有简单的方法来做到这一点,因此您可以使用 BsonDocument class ,它允许您使用字符串作为聚合管道定义:

var q = Col.Aggregate()
            .AppendStage<BsonDocument>(BsonDocument.Parse("{ $addFields: { AuthTypeInt: { $toString: \"$AuthType\" } } }"))
            .Match(BsonDocument.Parse("{ $expr: { $gt: [ { \"$strLenCP\": \"$AuthTypeInt\" }, 2 ] } }"));

var data = await q.ToListAsync();

代码看起来很难看,但它应该比 运行 普通 JavaScript(更多 here