Как мне найти все коллекции с определенной строкой в имени в моей базе данных MongoDB?

#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. Это больше похоже на это! Большое спасибо!