我在casbah中有一个游标,它是从查询返回的。如果我在游标上迭代,我得到了一定数量的结果,x。如果我执行相同的查询,并在游标上执行toList,我得到的列表大小是y,一个不同的数字。为什么?
我从一个测试用例中调用它,该测试用例使用默认的WriteConcern向集合写入了几百行。我知道写操作可能会有一些延迟。我不理解的是游标的不同大小:我迭代vs 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发布于 2014-05-02 11:52:29
发现了问题。问题出在传递给limit函数的负值。我不完全理解要限制的pos/neg值之间的语义差异,也不完全理解为什么它们会返回不同的计数,但切换到正数会返回预期的结果计数。
发布于 2014-05-01 16:50:15
它们应该是相同的,因为它们都在下面以相同的方式迭代,下面是一个示例:
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)https://stackoverflow.com/questions/23401597
复制相似问题