首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >casbah游标和toList

casbah游标和toList
EN

Stack Overflow用户
提问于 2014-05-01 11:30:08
回答 2查看 969关注 0票数 1

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

我从一个测试用例中调用它,该测试用例使用默认的WriteConcern向集合写入了几百行。我知道写操作可能会有一些延迟。我不理解的是游标的不同大小:我迭代vs toList。它们基本上不是在做同样的事情吗(假设我从迭代中得到一个列表)?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2014-05-02 11:52:29

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

票数 1
EN

Stack Overflow用户

发布于 2014-05-01 16:50:15

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

代码语言:javascript
复制
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)

如果在计数之间将新文档添加到数据库中,或者如果部分迭代游标,然后转换为列表,则可能会得到不同的结果,例如:

代码语言:javascript
复制
val cursor = collection.find()
cursor.next()
cursor.next()
assert(cursor.toList.length == 998)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23401597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档