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();