2015-08-21 1 views
2

Я использую последнюю версию драйвера Mongo C#, которая использует много шаблонов Async и builder. Это хорошо. Я пытаюсь преобразовать SQL where clauses в объект Mongo FilterDefinition.Mongo C# driver - Содержит фильтр

Любая идея, как обращаться с "содержит"?
как:

where x contains 'ABC' 
+1

ли' x' строку? – CodeCaster

ответ

4

Если 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()) 
{ 
    // ... 
} 
+0

Спасибо! Я использую 2.0 версию драйвера и не могу .Matches() в Filter Builder, но я мог бы найти .Regex(), поэтому я попытаюсь с этим. – Mr767267

1

Во-первых, я настоятельно рекомендую брать MongoDB University's .NET course (от самого Монго). Это действительно основательно и охватывает ваш вопрос (и многое другое) в глубину.

Во-вторых, я предполагаю, что x - это массив в вашем примере.

MongoDB правильно обрабатывает полиморфизм с массивами. Если у вас есть класс Post с массивом Tags, вы можете выбрать, где Tag = ABC.

Если вы используете методы linux C#, это выглядит как .Find(p => p.Tags == "ABC"). Если вы используете BsonDocument, это выглядит как new BsonDocument().Add("Tags", "ABC").

0

У меня есть другой способ, который я не люблю, но он работает. Ответ, который отмечен правильно, неверен (Матчи - это метод Builders). В этом примере/действует как% в запросе LIKE запроса sql. Я по-прежнему ищу лучший способ и обновляю, если найду тот, который больше соответствует фильтру 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(); 
+0

Неправильный метод вашего фильтра для фильтра. Он не может быть равным с тех пор, как вы ищете Содержит. –

7

Для того, чтобы достичь этого в 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