将cursor用作查询的迭代器

时间:2012-03-29 10:28:29

标签: mongodb pymongo nosql

我正在读关于mongodb的文章。碰到这一部分http://www.mongodb.org/display/DOCS/Tutorial它说 -

> var cursor = db.things.find();
> printjson(cursor[4]);
{ "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 }

“以这种方式使用光标时,请注意所有访问过的最高值(上面的光标[4])都会同时加载到RAM中。这不适用于大型结果集,因为你将用完内存。游标应该用作迭代器,任何返回大量元素的查询。“

如何将游标作为迭代器用于查询?感谢您的帮助

3 个答案:

答案 0 :(得分:14)

你已经标记过你正在使用pymongo,所以我将使用游标作为迭代器给你两个pymongo示例:

import pymongo
cursor = pymongo.Connection().test_db.test_collection.find()
for item in cursor:
    print item
    #this will print the item as a dictionary

import pymongo
cursor = pymongo.Connection().test_db.test_collection.find()
results = [item['some_attribute'] for item in cursor]
#this will create a list comprehension containing the value of some_attribute
#for each item in the collection

此外,您可以通过以下方式设置返回到pymongo驱动程序的批次大小:

import pymongo
cursor = pymongo.Connection().test_db.test_collection.find()
cursor.batchsize(20) #sets the size of batches of items the cursor will return to 20

通常没有必要弄乱批量大小,但如果您在运行驱动程序的机器在处理查询结果时遇到内存问题和页面错误,则可能必须设置此项以获得更好的性能(这对我来说似乎是一个痛苦的优化,我总是保留默认值。)

对于javascript驱动程序(启动“shell”时加载的驱动程序),文档的这一部分提醒您不要使用“数组模式”。从在线手册:

  

Shell中的阵列模式

     

请注意,在某些语言中,如JavaScript,驱动程序支持   “阵列模式”。请查看驱动程序文档以了解具体信息。

     

在db shell中,要在数组模式下使用游标,请使用array index []   操作和长度属性。

     

阵列模式会将所有数据加载到RAM中,直到最高索引   请求。因此,它不应该用于任何可以返回的查询   非常大量的数据:客户端内存不足。

     

您也可以在游标上调用toArray()。 toArray()将加载所有   对象查询到RAM。

答案 1 :(得分:2)

使用MongoDB Java驱动程序应该是这样的:

DBCursor cursor = collection.find( query );
while( cursor.hasNext() ) {
     DBObject obj = cursor.next();
     // do something tih obj
}

在mongo控制台中,您可以执行以下操作:

var cursor = db.things.find();
while(cursor.hasNext()) { printjson(cursor.next()); }

答案 2 :(得分:1)

MongoDB分批返回结果。要查看批处理中剩余的对象数,我们使用objLeftInBatch(),如下所示:


var c = db.Schools.find();
var doc = function() {return c.hasNext()? c.next : null;}
c.objLeftInBatch();

要遍历此批处理,我们可以使用我们在上面的代码块中设置的doc()。有关游标的更多知识可以在https://docs.mongodb.com/

找到