我正在使用最新版本的Mongo C#驱动程序,它使用了大量的Async和builder模式。这很好。我试图将SQL where子句转换为Mongo FilterDefinition对象。
任何想法如何处理"包含"? 像:
where x contains 'ABC'
答案 0 :(得分:13)
为了在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
答案 1 :(得分:5)
如果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 :(得分:1)
首先,我强烈建议采用MongoDB University's .NET course(来自Mongo本身)。它非常彻底,并且深入探讨了您的问题(及更多)。
其次,我假设你的例子中x
是一个数组。
MongoDB正确处理数组的多态性。如果您的班级Post
的数组为Tags
,则可以过滤Tag = ABC
的位置。
如果您使用的是C#linq方法,则看起来像.Find(p => p.Tags == "ABC")
。如果您使用的是BsonDocument
,则看起来像new BsonDocument().Add("Tags", "ABC")
。
答案 3 :(得分:0)
我有另一种方式,我不爱,但它有效。标记正确的答案是错误的(匹配是建筑者的一种方法)。在此示例中,/ act类似于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();
答案 4 :(得分:0)
我可以使用Filter.AnyIn使其正常工作
var filter = Builders<BsonDocument>.Filter.AnyIn("x", new List<string> { "ABC" });
如果您也正在寻找多个值,只需将它们添加到列表中即可。