0

我正在运行以下查询,但它不起作用。当我在 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             

谢谢你的帮助!

4

1 回答 1

2

如果没有您的数据并且能够运行您的查询,我不确定到底是什么问题。但是,这段代码有很多问题:

  • 为什么将其保存为脚本,然后调用 db.eval() 而不是直接运行更新?
  • 为什么需要重新索引?
  • 您的查询中不需要 $and 运算符。
  • 您不需要单独调用来查找和更新;事实上,一次调用 update 并将 multiupdate 标志设置为 true 就足够了。
  • {"$in": ["Notes"]} 中的 $in 是不必要的。
  • 使用 {$regex: '。绿红。'} 可能会很慢。$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
);
于 2013-09-19T16:38:44.513 回答