Mongo C#驱动程序 - 包含过滤器

12

我正在使用最新的Mongo C#驱动程序,它使用了大量的Async和构造器模式。这很好。我正在尝试将SQL where子句转换为Mongo FilterDefinition对象。

有什么办法处理"contains"吗?
例如:

where x contains 'ABC'
6个回答

19

为了在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 

7

如果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())
{
    // ...
}

我正在使用2.0版本的驱动程序,在Filter Builder上无法使用.Matches(),但我可以找到.Regex(),所以我会尝试使用它。 - Mr767267

2
我使用Filter.AnyIn得以使这个工作正常运行,代码如下:
var filter = Builders<BsonDocument>.Filter.AnyIn("x", new List<string> { "ABC" });

如果您需要查找多个值,只需将它们添加到列表中即可。

1

首先,我强烈建议学习MongoDB大学的.NET课程(由Mongo本身提供)。它非常全面,深入涵盖了您的问题(以及更多内容)。

其次,我假设在您的示例中x是一个数组。

MongoDB正确地处理数组的多态性。如果您有一个名为Post的类,其中包含Tags的数组,则可以过滤Tag = ABC

如果您使用的是C# linq方法,则看起来像.Find(p => p.Tags == "ABC")。如果您使用的是BsonDocument,则看起来像new BsonDocument().Add("Tags", "ABC")


0

我有另一种方式,虽然不喜欢但它能起作用。被标记为正确的答案是半对的(Match 是 Builders 的一种方法)。在这个例子中,/ 就像 sql 查询 LIKE 语句中的 %。我仍在寻找更好的方法,如果找到一个比下面的 Equals 过滤器更好的方法,我会进行更新。

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

你的筛选器构建方法不正确。它不能是“等于”,因为你要查找的是“包含”。 - Yiannis P.

0

如果你想要搜索输入的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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接