casbah cursor and 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

发现问题。问题在于传递给极限函数的负值。我不完全理解pos/neg值之间的语义差异,也不完全理解为什么它们会返回不同的计数,但切换到正数会返回预期的结果计数。

它们应该是相同的,因为它们下面都以相同的方式迭代,下面是一个例子:

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)

最新更新