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使它看起来像你想在那里使用 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)
于 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 回答