2011-07-14 22 views
1

は、私のようなオブジェクトを持っている:MongoDB:コンソールから直接新しいハッシュフィールドを追加するにはどうしたらいいですか?

{ "_id" : ObjectId("4e00e83608146e71e6edba81"), 
    .... 
    "text" : "Text now exists in the database"} 

を、私は

{ "_id" : ObjectId("4e00e83608146e71e6edba81"), 
    .... 
    "text" : "Text now exists in the database", 
    "tHash" : -4375633875013353634 } 

を作成するために、com.mongodb.util.Hash.longHashメソッドを使用して、Javaによるハッシュフィールドを追加することができます。しかし、これは非常に遅いです。 ; //

db.foo.find({}).forEach(関数(X){
x.tHash = someFunction(x.text):私は次のようにデータベース内の何かをできるようにしたいと思いcom.mongodb.util.Hash.longHashと互換性のある長いハッシュを作成する db.foo.save(x); });

私はこの長いハッシュをJavascript関数内でどのように呼び出せるか知っていますか?

答えて

0

JSはすべてを浮動体として扱い、Javaのようにオーバーフローを処理しないため、Mongo JavaドライバのHash.longHashメソッドをJavascriptで複製しようとしました。私はJSでのJavaのhashCode機能を複製するいくつかの例を見つけたので、私はこれをしなかった。少なくとも私は、既存のデータに整数レベルのハッシュコードをやらせる

longHash = function(s){ 
    var hash = 0; 
    if (s.length == 0) return hash; 
    for (i = 0; i < s.length; i++) { 
     char = s.charCodeAt(i); 
     hash = ((hash<<5)-hash)+char; 
     hash = hash & hash; // Convert to 32bit integer 
    } 
    return NumberInt(hash); 
}; 

db.foo.find({}).forEach(function (x) { 
    x.cHash = longHash(x.c); 
    db.foo.save(x); 
}); 

。これにより、索引付けのためのデータを絞り込むのに十分です。

更新:代わりにNumberIntタイプを返すように更新しました。デフォルトでは、ハッシュはJavascript番号であり、必要以上に多くのスペースを取るDoubleとしてMongoに格納されていました。 NumberIntは32ビット符号付き整数で、NumberLongは64ビット版です。

2

まず、使用するnice hashCode関数を定義します。 JavaScriptにはデフォルトですべてのオブジェクトのhashCode関数がありません。したがって、JavaScriptを記述する必要があります。それとも、このいずれかを使用します。

var hashCode = function(s) { 
    if (s == null) return 0; 
    if (s.length == 0) return 1; 
    var hash = 0; 
    for (var i = 0; i < s.length; i++) { 
     hash = ((hash << 5) - hash) + s.charCodeAt(i); 
     hash = hash & hash; // Convert to 32bit integer 
    } 
    return hash; 
}; 

は、代わりにMD5のような別のハッシュ関数を使用する - あなたのためにそれらを生成することができますスクリプトがあります。

関連する問題