2012-08-08 79 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); 
    })')