我正在使用最新版本的Mongo C#驱动程序,它使用了大量的异步和生成器模式。这很好。我试图将SQL where子句转换为Mongo FilterDefinition对象。Mongo C#驱动程序 - 包含过滤器
任何想法如何处理“包含”?
像:
where x contains 'ABC'
我正在使用最新版本的Mongo C#驱动程序,它使用了大量的异步和生成器模式。这很好。我试图将SQL where子句转换为Mongo FilterDefinition对象。Mongo C#驱动程序 - 包含过滤器
任何想法如何处理“包含”?
像:
where x contains '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())
{
// ...
}
谢谢! 我使用的是2.0版本的驱动程序,无法在过滤器生成器上使用.Matches(),但我可以找到.Regex(),所以我会尝试使用它。 – Mr767267
首先,我强烈建议采取MongoDB University's .NET course(从蒙戈本身)。这是非常彻底的,并且深入地涵盖了您的问题(以及更多)。
其次,我假设x
是你的例子中的一个数组。
MongoDB正确处理数组的多态性。如果你有一个类Post
和Tags
的数组,你可以过滤哪里Tag = ABC
。
如果您使用C#linq方法,那看起来像.Find(p => p.Tags == "ABC")
。如果您使用的是BsonDocument
,那看起来像new BsonDocument().Add("Tags", "ABC")
。
我有另一种方式,我不喜欢,但它的作品。标记正确的答案是错误的一半(匹配是建造者的一种方法)。在这个例子中,/行为像一个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();
您的筛选器的构建器方法不正确。它不能等于因为你正在寻找Contains。 –
为了实现在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'一个字符串? – CodeCaster