#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);