Mongo c# драйвер-содержит фильтр

Я использую последнюю версию драйвера Mongo C#, который использует много асинхронного и построителя. И это хорошо. Я пытаюсь преобразовать предложения SQL where в объект Mongo FilterDefinition.

любая идея, как обрабатывать "содержит"?
например:

where x contains 'ABC'

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())
{
    // ...
}

для достижения этого в API V2 используйте "фильтр".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 

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

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

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

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


У меня есть другой способ, который я не люблю, но он работает. Ответ, который отмечен правильно, наполовину неверен (Совпадения-это метод Строителей). В этом примере оператор / act like a % в 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();