2016-10-12 2 views
0

У меня есть база данных, содержащая несколько коллекций. У некоторых есть такое имя, как «carpenter_title_year_version». У других есть такое имя, как «plumber_title_year_version». Как настроить фильтр для извлечения всех коллекций, где строка «плотник» находится в имени коллекции?Как найти все коллекции с определенной строкой в ​​имени в моей базе данных MongoDB?

Я думаю, что-то вроде:

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

код и описание не совпадают. Похоже, у вас есть одна коллекция под названием 'dbname' и массивы с именем' carpenter' в ваших строго типизированных элементах типа 'GroupEntity'. Вы действительно пробовали этот код? –

+0

Нет, этот код не работает. В этом случае база данных называется «dbname». Он содержит коллекции с разными именами (например, «carpenter_titel_year_version». Я заинтересован в перечислении имен коллекции, а не в самом деле извлечении документов в них). Мне нужно создать список всех коллекций, принадлежащих «плотникам», и у них есть строка «плотник» как часть имени коллекции. – Lasse

+0

Вы должны удалить этот код. Это не имеет никакого отношения к тому, что вы хотите сделать. Меня это смутило. Похоже, вы собрали сборники для баз данных –

ответ

0

Там (и версии асинхронного его)

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); 
+0

Это больше похоже на это! Большое спасибо! – Lasse