Pythonからjavascriptコードを渡すには、それをでラップする必要があります。 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
を使用しているという事実 そこには、JavaScriptコードではなく、Pythonコードを使用したいように見えます。 ドキュメント
から 、find
から返されたCursorオブジェクトのように見えます PythonのSequenceプロトコルを実装します。つまり、forEach
の代わりに通常のPythonループを使用できるようにする必要があります。 (ドキュメントには、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)