http://motor.readthedocs.org/en/stable/
motor是一个建立在tornado和mongodb上的异步操作库,能够实现所有的mongodb操作。
一:导入module- import motor
二:连接mongodb
-
- db = motor.MotorClient('10.28.0.163').open_sync().project_test
相同情况下使用pymongo的命令为:
- db = pymongo.Connection('10.28.0.163').project_test
- #这样是blocking的
motor主要提供了两种操作mongodb的形式
1:第一种是在原有pymongo操作的基础上加入了回调函数
例如
- #原来的pymongo操作
- find = db.test.find_one({'key':'value'})
- new = db.test.update({'spec':'spec'},{'$set':{'key':'value'}})
- #motor操作
- find = db.test.find_one({'key':'value'},callback=_on_result1)
- new = db.test.update({'spec':'spec'},{'$set':{'key':'value'}},callback = _on_result2)
- @tornado.web.asynchronous
- def _on_result1(result,error):
- if error:
- do something
- do something
- def _on_result1(result,error):
- if error:
- do something
- do something
关于某些mongodb操作的回调函数的使用,motor有特别的规定,如find()需要调用motor的to_list(),具体情况需要用时请查询motor文档http://motor.readthedocs.org/en/stable/index.html
2.第二种方法, motor还提供了基于tornado的gen模块的操作,简单来说就是不在需要调用回调函数,而是采用yield来实现异步。
还是用上面的两个命令为例:
- #motor操作
- import tornado
- import motor
- class someHandler(tornado.web.RequestHandler):
- @tornado.web.asynchronous
- def post(self):
- ......do something....
- self.operation(db)
- ....do something ....
- @tornado.gen.engine
- def operation():
- find = yield motor.Op(db.test.find_one,{'key':'value'})
- new =yield motor.Op(db.test.update,{'spec':'spec'},{'$set':{'key':'value'}})
若执行结果是一个error,则返回error=some_error
若执行结果没有出错,则返回result = some_result
需要注意的是若要使用这种方法必须要加上标识@tornado.gen.engine