Pymongo forEach格式化

时间:2012-08-08 06:17:18

标签: python mongodb pymongo

如何格式化forEach函数,使其可以停留在多行而不会导致语法错误?像

这样的东西
self.request.db.myCollection.find().forEach( 
    function(u) { 
       u.forSong = self.request.db.song.find_one({}, {'_id': 1})
       self.request.db.save(u)
     })

2 个答案:

答案 0 :(得分:9)

要从Python传递javascript代码,您需要将其包装在bson.Code对象中,否则Python本身(而不是PyMongo)将尝试解析它。这给你:

import bson
self.request.db.myCollection.find().forEach(bson.Code( '''
    function(u) { 
       u.forSong = self.request.db.song.find_one({}, {'_id': 1})
       self.request.db.save(u)
     }'''))

但是你在那里使用self的事实使你看起来想要在那里使用Python代码,而不是javascript代码。从documentation开始,看起来find返回的Cursor对象实现了Python的Sequence协议 - 这意味着您应该只能使用常规的Python循环而不是forEach(其中的文档)似乎说PyMongo无论如何都没有实现):

for u in self.request.db.myCollection.find():
   u.forSong = self.request.db.song.find_one({}, {'_id': 1})
   self.request.db.myCollection.save(u)

答案 1 :(得分:1)

要在没有Python在后台执行任何操作的情况下传递任何mongo命令,您需要使用eval。因此,您的示例需要以这种方式调用:

self.request.db.eval('db.myCollection.find().forEach( 
    function(u) { 
       u.forSong = db.song.find_one({}, {"_id": 1});
       self.request.db.save(u);
     })')