Pymongo forEach格式化

zak*_*ces 3 python mongodb 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)
     })
Run Code Online (Sandbox Code Playgroud)

lvc*_*lvc 10

要从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)
     }'''))
Run Code Online (Sandbox Code Playgroud)

但是你self在那里使用的事实使你看起来想要在那里使用Python代码,而不是javascript代码.从文档中看,它看起来像从find实现Python的Sequence协议返回的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)
Run Code Online (Sandbox Code Playgroud)