#c# #mongodb #.net-core
#c# #mongodb #.net-core
Вопрос:
У меня есть база данных, содержащая несколько коллекций. У некоторых есть имя типа «carpenter_title_year_version». У других есть имя типа «plumber_title_year_version». Как мне настроить фильтр для извлечения всех коллекций, в которых строка «carpenter» находится в имени коллекции?
Я думаю что-то вроде:
var filterBuilder = Builders<GroupEntity>.Filter;
var projectionBuilder = Builders<GroupEntity>.Projection;
var collection = Database.GetCollection<GroupEntity>("dbname");
var filter = filterBuilder.ElemMatch("carpenter..., ?"); //<--- ???
var projection = projectionBuilder.Exclude("_id");
var list = await collection.Find(filter).Project(projection).ToListAsync();
Комментарии:
1. Код и описание не совпадают. Похоже, у вас есть одна вызываемая коллекция
dbname
и массивы, названныеcarpenter
в ваших строго типизированных элементах типаGroupEntity
. Вы действительно пробовали этот код?2. Нет, этот код не работает. В этом случае база данных называется «dbname». Он содержит коллекции с разными именами (например, «carpenter_titel_year_version». Меня интересует перечисление имен коллекций, а не фактическое извлечение документов в них). Мне нужно создать список всех коллекций, принадлежащих «плотникам», и у них есть строка «carpenter» как часть имени коллекции.
3. Вы должны удалить этот код. Это не имеет никакого отношения к тому, что вы хотите сделать. Это меня смутило. Похоже, вы перепутали коллекции для баз данных
4. Это вполне может быть правдой…
Ответ №1:
Существует (и его асинхронная версия)
IAsyncCursor<MongoDB.Bson.BsonDocument> IMongoDatabase.ListCollections(ListCollectionsOptions options = null, CancellationToken cancellationToken = null);
Вы можете использовать фильтр из параметров коллекции, чтобы соответствовать имени коллекции.
// <CAPS INSIDE> are wildcards
var _client = new MongoClient(@"connection string");
var _database = _client.GetDatabase("<DATABASE NAME>");
var bre = new BsonRegularExpression("<YOUR REGEX PATTERN>");
var copt = new ListCollectionsOptions{ Filter =
Builders<BsonDocument>.Filter.Regex ("name", bre )
};
var collectionsWithMatchingNames = _database.ListCollections(copt).ToList().Select (col => col["name"]);
Только тогда вы получаете свою конкретную коллекцию, например:
foreach (var x in collectionsWithMatchingNames)
var collection = _database.GetCollection<BsonDocument>(x);
Комментарии:
1. Это больше похоже на это! Большое спасибо!