3

構文エラーを発生させずに複数の行に配置できるように、forEach 関数をフォーマットするにはどうすればよいですか? 何かのようなもの

self.request.db.myCollection.find().forEach( 
    function(u) { 
       u.forSong = self.request.db.song.find_one({}, {'_id': 1})
       self.request.db.save(u)
     })
4

2 に答える 2

11

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オブジェクトはfindPythonの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)
于 2012-08-08T06:37:31.593 に答える
2

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);
     })')
于 2014-03-26T13:04:03.960 に答える