MongoDB对查找结果的优化

调用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 byorder 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 失效

你可能感兴趣的:(MongoDB对查找结果的优化)