Mongo c#驱动程序-包含过滤器
本文关键字:过滤器 -包 驱动程序 Mongo | 更新日期: 2023-09-27 18:09:09
我使用的是最新版本的Mongo c#驱动程序,它使用了很多Async和builder模式。这很好。我试图将SQL子句转换为Mongo FilterDefinition对象。
知道如何处理"contains"吗?
如:
where x contains 'ABC'
为了在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));