如何格式化 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
使它看起来像你想在那里使用 Python 代码,而不是 javascript 代码。从文档中,它看起来像从find
实现 Python 的序列协议返回的 Cursor 对象 - 这意味着您应该能够使用常规 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);
})')