2012-08-08 2 views
3

forEach 함수를 구문 오류를 일으키지 않고 여러 줄에 놓을 수있는 방법은 무엇입니까? 그렇지 않으면 파이썬 (오히려 PyMongo 이상) 자체가 구문 분석을 시도하기 때문에 파이썬에서 자바 스크립트 코드를 전달하는Pymongo forEach 서식 지정

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

백 슬래시를 시도 했습니까? –

답변

7

같은 것을, 당신은 bson.Code 객체에 포장해야합니다. 이것은 당신을 제공합니다 :

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을 사용하고 있다는 사실. documentation에서 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) 
1

파이썬이 백그라운드에서 아무것도하지 않고 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); 
    })')