我在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
答案 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)