Mongo C# 驱动程序 - 包含过滤器
Mongo C# driver - Contains Filter
我正在使用最新版本的 Mongo C# 驱动程序,它使用了很多异步和构建器模式。这很好。我正在尝试将 SQL where 子句转换为 Mongo FilterDefinition 对象。
知道如何处理 "contains" 吗?
喜欢:
where x contains 'ABC'
首先,我强烈建议使用 MongoDB University's .NET course(来自 Mongo 本身)。它真的很彻底,并且深入地涵盖了您的问题(以及更多)。
其次,我假设 x
在您的示例中是一个数组。
MongoDB 正确处理数组的多态性。如果你有一个 class Post
和 Tags
的数组,你可以过滤 Tag = ABC
.
如果您使用的是 C# linq 方法,则看起来像 .Find(p => p.Tags == "ABC")
。如果您使用 BsonDocument
,则看起来像 new BsonDocument().Add("Tags", "ABC")
。
如果 x
是一个字符串,您可以使用简单的正则表达式来实现。对于2.0驱动,可以手动创建FilterDefinition
:
FilterDefinition<BsonDocument> filter = "{ x : { $regex : /ABC/ } }";
或使用 Builder
:
构建过滤器
var builder = Builders<BsonDocument>.Filter;
var filter = builder.Matches("x", "ABC");
然后您可以在查询中使用过滤器:
using (var cursor = await collection.Find(filter).ToCursorAsync())
{
// ...
}
我有另一种我不喜欢但有效的方法。标记为正确的答案有一半是错误的(Matches 是 Builders 的一种方法)。在此示例中,/ 的作用类似于 sql 查询 LIKE 语句中的 %。我仍在寻找更好的方法,如果我在下面找到一个更等于过滤器的方法,我会更新。
List<yourobject> someList = await collection.Find("{ x: /Test/ }").ToListAsync();
var filter = Builders<yourobject>.Filter.Eq("x", "ABC");
List<yourobject> someList = await collection.Find(filter).ToListAsync();
为了在 V2 API 中实现这一点,请使用“Filter.Regex”:
var collection = db.GetCollection<BsonDocument>("collection");
var filter = Builders<BsonDocument>.Filter.Regex("fieldName", new BsonRegularExpression(".*fieldValue.*"));
var data = await (await coll.FindAsync<BsonDocument>(filter).ConfigureAwait(false)).ToListAsync();
//continue process data
我能够像这样使用 Filter.AnyIn 来完成这项工作
var filter = Builders<BsonDocument>.Filter.AnyIn("x", new List<string> { "ABC" });
如果您也在寻找多个值,这也适用,只需将它们添加到列表中即可。
如果您只想搜索输入 text
,您需要替换正则表达式特殊字符。
Regex.Escape
将确保这些字符按字面意思处理,而不是作为元字符处理。否则输入 text
可用于查询正则表达式模式,这可能不是必需的。
var text = "ABC";
var filter = Builders<BsonDocument>.Filter.Regex("x", BsonRegularExpression.Create(Regex.Escape(text)));
如果您需要不区分大小写的检查。然后你可以将不区分大小写的正则表达式传递给 BsonRegularExpression.Create
:
var text = "ABC";
var escapeText = Regex.Escape(text);
var regex = new Regex(escapeText, RegexOptions.IgnoreCase);
var filter = Builders<BsonDocument>.Filter.Regex("x", BsonRegularExpression.Create(regex));
我正在使用最新版本的 Mongo C# 驱动程序,它使用了很多异步和构建器模式。这很好。我正在尝试将 SQL where 子句转换为 Mongo FilterDefinition 对象。
知道如何处理 "contains" 吗?
喜欢:
where x contains 'ABC'
首先,我强烈建议使用 MongoDB University's .NET course(来自 Mongo 本身)。它真的很彻底,并且深入地涵盖了您的问题(以及更多)。
其次,我假设 x
在您的示例中是一个数组。
MongoDB 正确处理数组的多态性。如果你有一个 class Post
和 Tags
的数组,你可以过滤 Tag = ABC
.
如果您使用的是 C# linq 方法,则看起来像 .Find(p => p.Tags == "ABC")
。如果您使用 BsonDocument
,则看起来像 new BsonDocument().Add("Tags", "ABC")
。
如果 x
是一个字符串,您可以使用简单的正则表达式来实现。对于2.0驱动,可以手动创建FilterDefinition
:
FilterDefinition<BsonDocument> filter = "{ x : { $regex : /ABC/ } }";
或使用 Builder
:
var builder = Builders<BsonDocument>.Filter;
var filter = builder.Matches("x", "ABC");
然后您可以在查询中使用过滤器:
using (var cursor = await collection.Find(filter).ToCursorAsync())
{
// ...
}
我有另一种我不喜欢但有效的方法。标记为正确的答案有一半是错误的(Matches 是 Builders 的一种方法)。在此示例中,/ 的作用类似于 sql 查询 LIKE 语句中的 %。我仍在寻找更好的方法,如果我在下面找到一个更等于过滤器的方法,我会更新。
List<yourobject> someList = await collection.Find("{ x: /Test/ }").ToListAsync();
var filter = Builders<yourobject>.Filter.Eq("x", "ABC");
List<yourobject> someList = await collection.Find(filter).ToListAsync();
为了在 V2 API 中实现这一点,请使用“Filter.Regex”:
var collection = db.GetCollection<BsonDocument>("collection");
var filter = Builders<BsonDocument>.Filter.Regex("fieldName", new BsonRegularExpression(".*fieldValue.*"));
var data = await (await coll.FindAsync<BsonDocument>(filter).ConfigureAwait(false)).ToListAsync();
//continue process data
我能够像这样使用 Filter.AnyIn 来完成这项工作
var filter = Builders<BsonDocument>.Filter.AnyIn("x", new List<string> { "ABC" });
如果您也在寻找多个值,这也适用,只需将它们添加到列表中即可。
如果您只想搜索输入 text
,您需要替换正则表达式特殊字符。
Regex.Escape
将确保这些字符按字面意思处理,而不是作为元字符处理。否则输入 text
可用于查询正则表达式模式,这可能不是必需的。
var text = "ABC";
var filter = Builders<BsonDocument>.Filter.Regex("x", BsonRegularExpression.Create(Regex.Escape(text)));
如果您需要不区分大小写的检查。然后你可以将不区分大小写的正则表达式传递给 BsonRegularExpression.Create
:
var text = "ABC";
var escapeText = Regex.Escape(text);
var regex = new Regex(escapeText, RegexOptions.IgnoreCase);
var filter = Builders<BsonDocument>.Filter.Regex("x", BsonRegularExpression.Create(regex));