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 演算子は必要ありません。
  • 検索と更新のために別々の呼び出しを行う必要はありません。実際、multiupdate フラグを true に設定して update を 1 回呼び出すだけで十分です。
  • {"$in": ["Notes"]} では $in は不要です。
  • {$regex: ' を使用します。グリーンレッド。'} は遅くなる可能性があります。インデックスはプレフィックスの照合にしか使用できないため、この場合、$regex 演算子はインデックスを使用できません。http://docs.mongodb.org/manual/reference/operator/regex/の最後の段落を参照してください。

これが UMongo によって生成されたコードである場合は、UMongo から離れて、公式にサポートされている mongo シェルを使用することをお勧めします。

更新の呼び出しを修正するには、mongo シェルで次のようなものを実行してみてください。

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 に答える