Aby przekazać kod JavaScript z Pythona, musisz umieścić go w bson.Code
obiekt, ponieważ w przeciwnym razie sam Python (a nie PyMongo) spróbuje go przeanalizować. To daje:
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)
}'''))
Ale fakt, że używasz self
tam wygląda na to, że chcesz użyć kodu Pythona, a nie kodu javascript. Z dokumentacji
, wygląda na to, że obiekt Cursor zwrócony z find
implementuje protokół Sequence Pythona - co oznacza, że powinieneś być w stanie użyć zwykłej pętli Pythona zamiast forEach
(którego dokumentacja wydaje się mówić, że PyMongo i tak nie implementuje):
for u in self.request.db.myCollection.find():
u.forSong = self.request.db.song.find_one({}, {'_id': 1})
self.request.db.myCollection.save(u)