MongoDB: Как я могу добавить новое хеш-поле прямо из консоли? - PullRequest
1 голос
/ 14 июля 2011

У меня есть такие объекты, как:

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

и я могу добавить поля хеша через Java, используя метод com.mongodb.util.Hash.longHash для создания

{ "_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 (х); });

Кто-нибудь знает, как я могу вызвать этот длинный хеш в функции Javascript?

Ответы [ 2 ]

2 голосов
/ 11 октября 2011

Сначала определите красивую функцию 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 - есть сценарии, которые могут сгенерировать их для вас.

0 голосов
/ 10 ноября 2012

Я прекратил попытки тиражировать метод Mongo Java-драйвера Hash.longHash в Javascript, поскольку JS обрабатывает все как плавающее и не обрабатывает переполнение, как в Java. Я нашел несколько примеров репликации функции hashCode Java в JS, и поэтому я сделал это:

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 и хранился в Mongo как Double, занимая гораздо больше места, чем необходимо. NumberInt - это 32-разрядное целое число со знаком, а NumberLong - это 64-разрядная версия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...