Курсор MongoDB не возвращает все документы в коллекции

#c# #mongodb

#c# #mongodb

Вопрос:

Я пытаюсь перебрать каждый документ в коллекции и сохранить их в файле Excel. В настоящее время имеется 857 документов, и я подтвердил это в Compass, но возвращается только 756. Что остановит возврат всех документов?

Сначала я подумал, что это связано с моим сопоставлением объектов, но я вернулся к Bsondocuments и получил тот же результат. Есть ли что-то, чего мне здесь не хватает?

                 var db = client.GetDatabase("database");
                var collection = db.GetCollection<BsonDocument>("collection");
                var filter = new BsonDocument();
                using (var cursor = collection.Find(filter).ToCursor())

                    while (cursor.MoveNext())
                    {
                        int i = 1;
                        foreach (var doc in cursor.Current)

                        {
                            ;
                            sheet.Cells["A"   i.ToString()].Value = doc.ToString();
                            i  ;
                            Console.WriteLine("Documents found: "   i);
  
 Documents found: 757
  

Комментарии:

1. Просмотрите документацию драйвера для итерации, если ваш код отличается от документации, скорректируйте свой код в соответствии с документацией, если у вас все еще есть неожиданные результаты, обратитесь к документации, в которой указан правильный шаблон итерации, которому вы следуете.

Ответ №1:

Курсор Mongo возвращает документы пакетами. Вы переходите от пакета к пакету, используя MoveNext, а затем обрабатываете документы в Current. Для этого отображается код, но счетчик i сбрасывается на 1 в каждом пакете. Вы захотите сделать что-то вроде:

             var db = client.GetDatabase("database");
            var collection = db.GetCollection<BsonDocument>("collection");
            var filter = new BsonDocument();
            using (var cursor = collection.Find(filter).ToCursor()){
                int i = 1;
                while (cursor.MoveNext())
                {                        
                    foreach (var doc in cursor.Current)

                    {
                        ;
                        sheet.Cells["A"   i.ToString()].Value = doc.ToString();
                        i  ;                     
                    }
                }
                Console.WriteLine("Documents found: "   i);
             }
  

С другой стороны, это может быть проще сделать:

     int i = 1;
    await cursor.ForEachAsync(doc => {
      sheet.Cells["A"   i.ToString()].Value = doc.ToString()
      i  ;
    });
    Console.WriteLine("Documents found: "   i);
  

или, если вы не настроены на асинхронность:

     int i = 1;
    cursor.ForEachAsync(doc => {
      sheet.Cells["A"   i.ToString()].Value = doc.ToString()
      i  ;
    }).Wait();
    Console.WriteLine("Documents found: "   i);