За да подадете 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 код. От документация
, изглежда като обектът Cursor, върнат от find
внедрява протокола Sequence на Python – което означава, че трябва просто да можете да използвате обикновен цикъл на 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)