2012-04-18 58 views

回答

2

到目前为止,我发现,最简单的方法是相适应的联苏答案使用pymongo.code.Code类db.eval(),是这样的:

db.eval(Code("function() {" 
      "coll.find({}, {field1: 1, field2: 2})" 
      ".forEach(function(doc) {" 
      " doc.field1 += doc.field2;" 
      " coll.save(doc);" 
      " });" 
      "}")) 

您可以选择保存js脚本在服务器上从mongo外壳与db.system.js.save({_id:'myfunc', value: function(){...}}); 并从python执行db.eval(Code('return myfunc()'))

+1

请注意,在当前版本的MongoDB(所有版本2.0.x及更早版本)中,只有1个javascript进程可以在服务器上同时运行。这个特殊的功能可能相当快,但是如果Map-Reduce作业同时运行,它可能会阻止此功能(反之亦然)。由于这些原因,服务器端JavaScript通常要谨慎使用。 – dcrosta 2012-04-18 19:36:09

+0

谢谢你的提醒。请牢记这一点。 – richard 2012-04-18 19:47:26

-2
Col.update({}, {'$set': {'field1': field1 + field2}) 

空{}是选择标准,或where子句。

+0

我很困惑,为什么没有引号field1和field2周围。这些不会从先前的查询中定义。 – richard 2012-04-18 08:47:01

+0

为此,您需要查询文档并在应用程序代码中执行字段连接。 MongoDB目前无法执行此服务器端(尽管请参阅https://jira.mongodb.org/browse/SERVER-4079以跟踪实现此功能请求的进度) – dcrosta 2012-04-18 14:48:08

+0

要清楚,我的意思是sum而不是concatenation(即在MySQL中会是CONCAT(field1,field2)),但是相同的区别。 – richard 2012-04-18 19:22:46