调用MongoDB的find()查询之后,返回的是一个游标对象
使用pymongo 的find_one()查询之后,返回的是是个dict 对象
对游标对象的处理可以对结果排序,限制查询结果数量和跳过
python方便的遍历同样适用于cursor对象
for user in db.users.find():
print user
limit skip 和sort
以下查询将只返回三个先找到的结果
users = db.users.find().limit(3)
当然如果结果不够3个,那么只会返回相应数量的结果
以下查询会跳过前三个结果
users = db.users.find().skip()
少于三个的情况下 会返回None
上面这两个函数对应的是sql中的limit x,y
然后是排序
用sort函数
以下查询会用username 的升序来排序
users db.users.find().sort({'username': 1 })
将1 换成 -1 就是降序排序了
对应sql 中的order by
和order by desc
语句
需要注意的 上面这三个函数返回的结果都是cursor对象,所以可以级联调用
并且find()函数执行之后并不会真正去查询,只有当全部查询构造完成之后才
会执行查询
关于skip()
与其他函数不同的是skip()是查找到结果之后忽略,如果skip的值过于大,那么会很影响效率
这样的话可以使用编程的方法避免skip()跳过过多值
比如
我要查询所有word文档按上传时间排序的第100 到200个文件
db.docs.find().sort({'uploadtime':1}).limit(100)
##用户点击翻页,请求第100 到200
db.docs.find().sort({'uploadtime':1}).limit(100).skip(100)
这种情况下可以这样写
docs = db.docs.find().sort({'uploadtime':1}).limit(100)
last = list(docs )[-1].get('uploadtime')
docs = db.docs.find({'uploadtime':{'$gt': last } }).sort({'uploadtime':1}).limit(100)
总之就是想法设法避免跳过大量查询
另外需要注意的是
在web 开发时不要将cursor 对象直接返回, 最好将其用list()工厂函数转换
原因1在于cursor只存在10分钟
其次在于cursor 只能遍历一次 对结果遍历一次将使cursor 失效