構文エラーを発生させずに複数の行に配置できるように、forEach 関数をフォーマットするにはどうすればよいですか? 何かのようなもの
self.request.db.myCollection.find().forEach(
function(u) {
u.forSong = self.request.db.song.find_one({}, {'_id': 1})
self.request.db.save(u)
})
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コードを使用したいように見えます。ドキュメントから、から返されたCursorオブジェクトは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)
Python がバックグラウンドで何も実行せずに mongo コマンドを渡すには、eval を使用する必要があります。したがって、例は次のように呼び出す必要があります。
self.request.db.eval('db.myCollection.find().forEach(
function(u) {
u.forSong = db.song.find_one({}, {"_id": 1});
self.request.db.save(u);
})')