MongoDB:如何直接从控制台添加新的哈希字段?

时间:2011-07-14 17:45:03

标签: mongodb

我有像:

这样的对象
{ "_id" : ObjectId( "4e00e83608146e71e6edba81" ),
  ....
  "text" : "Text now exists in the database"}

我可以使用com.mongodb.util.Hash.longHash方法通过java添加哈希字段来创建

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

但这很慢。我希望能够在数据库中做一些事情,如:

db.foo.find({})。forEach(function(x){
  x.tHash = someFunction(x.text); //创建一个与com.mongodb.util.Hash.longHash兼容的长哈希   db.foo.save(X); });

有谁知道如何在Javascript函数中调用这个长哈希?

2 个答案:

答案 0 :(得分:2)

首先定义一个好用的hashCode函数。默认情况下,JavaScript在所有对象上都没有hashCode函数,因此您需要编写一个。或者只使用这个:

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 - 有些脚本可以为你生成它们。

答案 1 :(得分:0)

我放弃了尝试在Javascript中复制Mongo Java驱动程序Hash.longHash方法,因为JS将所有内容都视为浮点数并且不像Java那样处理溢出。我找到了一些在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位版本。