我在MongoDB中将游标指定给一个变量:
var myCursor = db.inventory.find({},{'name':1}).sort({'name':1});
其中name
是集合inventory
的属性。知道我的inventory
集合只有4个文档可能会有所帮助。
然后我使用以下代码使用cursorInfo
命令:
db.runCommand({cursorInfo:1});
当我看到输出时,它声称totalOpen
游标为0,游标的clientCursors_size
为0,并且timedOut
游标的数量也为0 。cursorInfo
无法检测到myCursor
有什么具体原因吗? (如果这是初学者的问题,我很抱歉,但我刚开始学习MongoDB。)
注意:我还尝试完全使用光标(通过myCursor
)并检索光标中的一个项目(通过myCursor[0]
),但我仍然得到相同的输出。
答案 0 :(得分:2)
如果集合中的文档数量非常少,则必须包含batchSize():db.items.find()。batchSize(2)for
通过此链接了解光标行为:http://docs.mongodb.org/manual/core/read-operations/#cursor-behaviors
由于您正在使用排序,我确信它们不是'name'键的索引,或者不超过101个文档(或1 MB文档)。让我用一个例子来解释。
test:Mongo > db.runCommand({cursorInfo:1});
{ "totalOpen" : 2, "clientCursors_size" : 2, "timedOut" : 1, "ok" : 1 }
test:Mongo > var x = db.test2.find().sort({ a : -1}).batchSize(5);
test:Mongo > x.next()
test:Mongo > db.runCommand({cursorInfo:1});
{ "totalOpen" : 2, "clientCursors_size" : 2, "timedOut" : 1, "ok" : 1 }
因此,打开游标没有变化(查看我上面粘贴的文档),因为缺少{a:1}上的索引 现在让我们添加索引。
test:Mongo > db.test2.ensureIndex({ a : -1 })
test:Mongo > var x = db.test2.find().sort({ a : -1}).batchSize(5);
test:Mongo > db.runCommand({cursorInfo:1});
{ "totalOpen" : 2, "clientCursors_size" : 2, "timedOut" : 1, "ok" : 1 }
test:Mongo > x.next()
test:Mongo > db.runCommand({cursorInfo:1});
{ "totalOpen" : 3, "clientCursors_size" : 3, "timedOut" : 1, "ok" : 1 }