如何格式化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 :(得分:9)
要从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
的事实使你看起来想要在那里使用Python代码,而不是javascript代码。从documentation开始,看起来find
返回的Cursor对象实现了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)
答案 1 :(得分:1)
要在没有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);
})')