För att skicka in javascript-kod från Python måste du slå in den i en bson.Code
objekt, eftersom Python själv (snarare än PyMongo) annars kommer att försöka analysera det. Detta ger dig:
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)
}'''))
Men det faktum att du använder self
där får det att se ut som att du vill använda Python-kod där, inte javascript-kod. Från dokumentationen
, det ser ut som att markörobjektet returneras från find
implementerar Pythons Sequence-protokoll - vilket betyder att du bara borde kunna använda en vanlig Python-loop istället för forEach
(vilket dokumenten verkar säga att PyMongo ändå inte implementerar):
for u in self.request.db.myCollection.find():
u.forSong = self.request.db.song.find_one({}, {'_id': 1})
self.request.db.myCollection.save(u)