Перебирая коллекции MongoDB и соединяя их в C # - PullRequest
0 голосов
/ 28 августа 2018

У меня есть коллекция в MongoDB, в которой есть документ с именами коллекций, с которыми мне нужно работать. Мне нужно запросить эту коллекцию, получить все имена коллекций из документа внутри этой коллекции, а затем запросить эти коллекции и объединить их на основе ссылок ParentId. Ниже приводится коллекция, в которой хранится название другой коллекции

db.AllInfoCollection.find()
{
    "_id" : ObjectId("5b83b982a5e17c383c8424f3"),
    "CollName" : "Collection1",
},
{
    "_id" : ObjectId("5b83b9aaa5e17c383c8424f7"),
    "CollName" : "Collection2",
},
{
    "_id" : ObjectId("5b83b9afa5e17c383c8424f8"),
    "CollName" : "Collection3",
},
{
    "_id" : ObjectId("5b83b9b5a5e17c383c8424f9"),
    "CollName" : "Collection4",
},
{
    "_id" : ObjectId("5b83b9b9a5e17c383c8424fa"),
    "CollName" : "Collection5",
},
{
    "_id" : ObjectId("5b84f41bc5eb3f1f7c291f94"),
    "CollName" : "Collection6",
}

Все перечисленные коллекции (Collection1, Collection2, .... Collection6) создаются во время выполнения с пустыми документами. Они связаны друг с другом полями Id и ParentId. Теперь мне нужно запросить этот AllInfoCollection , получить имена коллекций и присоединиться к ним и сгенерировать окончательный результат соединения ($ lookup). Я могу запросить и получить список сбора, но я не уверен, как добавить проекцию поиска в цикл for. Любая помощь будет оценена.

public void RetrieveDynamicCollection()
    {
        IMongoDatabase _db = client.GetDatabase("MyDb");
        var collectionList = _db.GetCollection<AllInfoCollection>("AllInfoCollection").AsQueryable().Distinct().Select(x => x.CollectionName).ToList();

        for(int i = 0; i < collectionList.Count; i++)
        {
            var collectionName = collectionList[i];
            IMongoCollection<BsonDocument> collection = _db.GetCollection<BsonDocument>(collectionName);
            var options = new AggregateOptions()
            {
                AllowDiskUse = false
            };
            //not able to proceed here
        }

    }

1 Ответ

0 голосов
/ 02 сентября 2018

Наконец-то я смог динамически извлекать коллекции со всеми необходимыми объединениями (объединение поиска), как показано ниже, надеюсь, это кому-нибудь поможет:

public async Task<string> RetrieveDynamicCollection()
    {
        try
        {
            IMongoDatabase _db = client.GetDatabase("MyDB");
            var list = _db.GetCollection<HazopCollectionInfo>("AllCollectionInfo").AsQueryable().ToList();
            var collectionList = list.OrderBy(x => x.CollectionOrder).Select(x => x.CollectionName).Distinct().ToList();

            var listOfJoinDocuments = new List<BsonDocument>();

            var firstCollection = _db.GetCollection<BsonDocument>(collectionList[0]);
            var options = new AggregateOptions()
            {
                AllowDiskUse = false
            };
            var previousCollectionName = "";
            for (int i = 0; i < collectionList.Count; i++)
            {
                var collectionName = collectionList[i];
                IMongoCollection<BsonDocument> collection = _db.GetCollection<BsonDocument>(collectionName);
                if (i == 0)
                {
                    firstCollection = collection;
                    var firstarray = new BsonDocument("$project", new BsonDocument()
                        .Add("_id", 0)
                        .Add(collectionName, "$$ROOT"));

                    listOfJoinDocuments.Add(firstarray);
                }
                else
                {
                    var remainingArray = new BsonDocument("$lookup", new BsonDocument()
                            .Add("localField", previousCollectionName + "." + "Id")
                            .Add("from", collectionName)
                            .Add("foreignField", "ParentId")
                            .Add("as", collectionName));
                    listOfJoinDocuments.Add(remainingArray);

                    remainingArray = new BsonDocument("$unwind", new BsonDocument()
                            .Add("path", "$" + collectionName)
                            .Add("preserveNullAndEmptyArrays", new BsonBoolean(true)));
                    listOfJoinDocuments.Add(remainingArray);
                }
                previousCollectionName = collectionName;
            }
            // Project the columns 
            list.OrderBy(x => x.ColumnOrder);
            var docProjection = new BsonDocument();
            for(int i=0;i<list.Count;i++)
            {
                docProjection.Add(list[i].ColumnName, "$"+list[i].CollectionName + "." + list[i].FieldName);
            }

            listOfJoinDocuments.Add(new BsonDocument("$project", docProjection));


            PipelineDefinition<BsonDocument, BsonDocument> pipeline = listOfJoinDocuments;

            var listOfDocs = new List<BsonDocument>();
            using (var cursor = await firstCollection.AggregateAsync(pipeline, options))
            {
                while (await cursor.MoveNextAsync())
                {
                    var batch = cursor.Current;
                    foreach (BsonDocument document in batch)
                    {
                        listOfDocs.Add(document);
                    }
                }
            }

            var jsonString = listOfDocs.ToJson(new MongoDB.Bson.IO.JsonWriterSettings { OutputMode = MongoDB.Bson.IO.JsonOutputMode.Strict });

            return jsonString;
        }
        catch(Exception ex)
        {
            throw ex;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...