casbah курсор и toList

У меня есть курсор в casbah, возвращенный из запроса. Если я перебираю курсор, я получаю определенное количество результатов, x. Если я выполняю тот же запрос и выполняю toList для курсора, я получаю список размера y, другого числа. Почему?

Я вызываю это из тестового примера, который только что записал несколько сотен строк в коллекцию, используя WriteConcern по умолчанию. Я понимаю, что может быть некоторая задержка с записью. Чего я не понимаю, так это разных размеров курсора: я повторяю против toList. Разве они в основном не делают одно и то же (предполагая, что я получаю список из своей итерации)?

val cur = findCursor(query, orderBy).skip(skip).limit(chunkSize * -1) // results size x if I iterate cur
val ret = cur.toList.map( dbo => SJ.readDB[T](dbo) ). // List size y here after toList

person Greg    schedule 01.05.2014    source источник
comment
Кажется, это видел другой человек (stackoverflow.com/questions/23410483). Мне бы хотелось, чтобы тестовый пример воспроизводил его.   -  person Ross    schedule 01.05.2014
comment
Также какая версия Casbah & MongoDB?   -  person Ross    schedule 01.05.2014


Ответы (2)


Проблема была найдена. Проблема заключалась в отрицательном значении, переданном в функцию limit. Я не совсем понимаю семантическую разницу между значениями pos/neg для ограничения или почему они возвращают разные значения, но переключение на положительное число вернуло ожидаемый результат.

person Greg    schedule 02.05.2014

Они должны быть одинаковыми, так как они оба повторяются одинаково внизу, вот пример:

import com.mongodb.casbah.Imports._
val collection = MongoClient()("test")("myColl")
collection.drop()
1 to 1000 foreach { i => collection.insert(MongoDBObject("_id" -> i)) }

val count1 = collection.count() // Get a count from the server
val count2 = collection.find().foldLeft(0)( (x, doc) => x+1) // Iterate the cursor
val count3 = collection.find().toList.length // Use toList to iterate

assert(count1 == count2)
assert(count2 == count3)

Вы можете получить разные результаты, если новые документы были добавлены в базу данных между подсчетами или если вы частично повторяете курсор, а затем конвертируете в список, например:

val cursor = collection.find()
cursor.next()
cursor.next()
assert(cursor.toList.length == 998)
person Ross    schedule 01.05.2014