MongoDB получает данные слишком медленно - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть документы с огромным количеством полей (7500 полей в каждом), но значения полей - это простые данные (только цифры), когда я пытаюсь запросить коллекцию, она прекрасно работает (я смотрю на профилировщик монго и правильно использую индексы), нослишком много времени занимает итерация курсора (для получения данных). Количество полученных документов составляет ~ 450, но для получения всех документов требуется около 2 минут. Я уже обновил версию mongoDB до последней, также обновил драйвер MongoDB (для .NET),воссозданные индексы, но ничего не помогает

PS соединение не медленное (сервер BD находится в моей локальной сети - 100Base-T / Fast Ethernet) Пример кода запроса ниже

        var builder = Builders<BsonDocument>.Filter;

        var filter = builder.Eq("OrgID", orgID);
        filter = filter & builder.Eq("DateDeleted", (DateTime?)null);

        var collection = GetCollection("NameOfCollection");
        var result = collection.Find(filter);

        using (var cursor = result.ToCursor())
        {
            while (cursor.MoveNext())
            {
                var batch = cursor.Current;
                foreach (var document in batch)
                {
                    yield return document;
                }
            }
        }

, и у меня есть индексдля этих полей отдельно, а также есть составной индекс с обоими полями в одном индексе

, и он прекрасно работает с коллекциями, где гораздо больше документов, но меньше полей (~ 20 полей в каждом документе)

1 Ответ

0 голосов
/ 14 февраля 2019

Почему вы используете курсор?Я понимаю, что выбирает каждую запись в отдельности.Бьюсь об заклад, если бы вы перебрали ToList () вместо этого, вы бы получили лучшую производительность, потому что он извлекал бы все данные за один вызов.

Foreach(var batch in collection.Find(filter).ToList()){
    // your other code here
}

Также вы получаете результат, который означает, что этовложенный в IEnumerable, и что бы вы ни делали между этими вызовами извлечения, это может замедлить процесс, но вы пропустили этот код, так что трудно сказать.

...