casbah游标和toList

时间:2014-05-01 03:30:08

标签: mongodb scala casbah

我在casbah中有一个游标,从查询中返回。如果我迭代光标,我得到一定数量的结果,x。如果我执行相同的查询并在光标上执行toList,我会得到大小为y的列表,一个不同的数字。为什么呢?

我正在使用默认的WriteConcern从一个只有几百行的测试用例中调用它。我知道写入可能会有一些延迟。我不明白的是光标的不同大小:我迭代vs toList。他们基本上不做同样的事情(假设我从迭代中产生一个List)?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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)