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

本文关键字:过滤器 -包 驱动程序 Mongo | 更新日期: 2023-09-27 18:09:09

我使用的是最新版本的Mongo c#驱动程序,它使用了很多Async和builder模式。这很好。我试图将SQL子句转换为Mongo FilterDefinition对象。

知道如何处理"contains"吗?
如:

where x contains 'ABC'

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

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

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

我能够使用过滤器得到这个工作。

var filter = Builders<BsonDocument>.Filter.AnyIn("x", new List<string> { "ABC" });

如果你也在寻找多个值,只需将它们添加到列表中。

首先,我强烈建议参加MongoDB大学的。net课程(从MongoDB本身)。它真的很全面,并且深入地涵盖了你的问题(以及更多)。

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

MongoDB正确处理数组的多态性。如果你有一个类Post和一个Tags数组,你可以在Tag = ABC .

如果你正在使用c# linq方法,它看起来像.Find(p => p.Tags == "ABC")。如果你用的是BsonDocument,它看起来就像new BsonDocument().Add("Tags", "ABC")

我有另一种方法,我不喜欢,但它有效。标记为正确的答案是错误的一半(匹配是建设者的一种方法)。在本例中,/的作用类似于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();

如果您只想搜索输入text,则需要替换regex特殊字符。

Regex.Escape将确保按字面处理这些字符,而不是作为元字符处理。否则,输入text可以用来查询regex模式,这可能不是需要的。

var text = "ABC";
var filter = Builders<BsonDocument>.Filter.Regex("x", BsonRegularExpression.Create(Regex.Escape(text)));

如果需要不区分大小写检查。然后您可以将不区分大小写的regex传递给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));