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