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

时间:2015-08-21 10:58:12

标签: c# mongodb mongodb-.net-driver mongodb-csharp-2.0

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

任何想法如何处理"包含"? 像:

where x contains 'ABC'

5 个答案:

答案 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" });

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