MongoDB更新查询不起作用

时间:2013-09-19 15:09:22

标签: mongodb mongojs

我正在运行以下查询,但它不起作用。当我在mongo UI中运行查询部分时,它返回我预期的结果。我正在使用UMongo。但它没有按预期更新文档。

db.system.js.save ({    
_id:"script_1",
value: function() {

    print("in function>>");             

    db.data.find({"$and": 
        [{"title":{$regex : '.*Green Red.*', $options : 's'}},
         {"editor.key": {"$in": ["74014","45339"]}}, {"types" : {"$in": ["Notes"]}}]}).forEach(
          function(docMatch){
                  print("Matching document found");
                      db.data.update(docMatch, 
                              {$set:{"editor.key": "05335","editor.value": "editor1", 
                          "editor.email": "editor1@gmail.com"}
                    }, false, true);
      }
    );

    db.data.reIndex();
    }
 });

 db.eval("script_1()");  

我确实在mongo日志中看到“找到匹配的文档”,但没有更新。在日志中也显示以下消息。

     Thu Sep 19 11:03:43 [conn1279] warning: ClientCursor::yield can't unlock b/c of recursive lock ns             

谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

如果没有您的数据并且能够运行您的查询,我不确定问题究竟是什么。但是,此代码存在许多问题:

  • 为什么要将其保存为脚本,然后调用db.eval()而不是直接运行更新?
  • 为什么需要重新索引?
  • 您的查询中不需要$和运算符。
  • 您无需单独调用即可查找和更新;实际上,将multiupdate标志设置为true进行一次更新调用就足够了。
  • 在{“$ in”:[“Notes”]}中,$ in是不必要的。
  • 使用{$ regex:'。 Green Red。'}可能会很慢。在这种情况下,$ regex运算符不能使用索引,因为索引只能用于匹配前缀。请参阅此处的最后一段:http://docs.mongodb.org/manual/reference/operator/regex/

如果这是UMongo生成的代码,我建议远离UMongo并使用官方支持的mongo shell。

为了修复你的更新调用,请尝试在mongo shell中运行类似的东西:

db.data.update(
  {
    "title": {$regex : '.*Green Red.*', $options : 's'},
    "editor.key": {"$in": ["74014","45339"]},
    "types" : "Notes"
  },
  {
    $set: {
            "editor.key": "05335",
            "editor.value": "editor1",
            "editor.email": "editor1@gmail.com"
          }
  },
  false,
  true
);