2012-08-08 86 views
3

如何格式化forEach函数,以便它可以在多行上放置而不会导致语法错误?喜欢的东西Pymongo for each formatting

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

你试过拖尾反斜杠吗? – 2012-08-08 06:20:40

回答

7

要通过JavaScript代码从Python中,你需要用它在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返回的光标对象实现了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

传递任何蒙戈命令,而无需Python的在后台做任何事情,你需要使用eval。所以你的例子需要这样调用:

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