Запрос на близкие совпадения в MongoDB и Rails 3 - PullRequest
1 голос
/ 28 декабря 2011

Итак, мне нужно написать что-то в Rails 3, которое выполняет запрос к MongoDB (если вы не знаете, монго, мне не нужен код, только некоторые идеи), которое может запрашивать данные для близких совпадений. Например, допустим, вы ищете коллекцию для {item: a, item2: b, item3: c}. И точное совпадение будет иметь все три, но я также хочу совпадения, которые опускают один из трех ключей. У меня есть две теории о том, как я должен справиться с этим. Один из них - сделать несколько запросов, чтобы опустить определенные части данных, а другой - написать комплекс или оператор. Я не считаю, что это лучшие решения. Может ли кто-нибудь еще предложить мне что-нибудь? Даже если это с точки зрения SQL, это будет работать для меня.

Мне нужно что-то, что можно сделать быстро. Это для поиска, который должен возвращать результаты как можно быстрее.

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Еще одним подходом будет использование MapReduce.

С его помощью вы можете рассчитать, сколько полей соответствует документу.

Хотя это не очень эффективный подход в данный момент (но один изнаиболее гибкий).

Код может быть примерно таким:

var m = function() {
  var fieldsToMatch = {item: a, item2: b, item3: c};
  for(var k in fieldsToMatch) {
    if(this[k] == fieldsToMatch[k]) {
      emit(this.id, {count : 1}); // emit 1 for each field matched 
    }
  }
};

var r = function(k, vals) {
  var result = {count: 0};
  vals.forEach(function(v) {
    result.count += v.count;
  });
  return result;
}

db.items.mapReduce(m, r, {out: 'out_collection'});
0 голосов
/ 29 декабря 2011

Почему вы просто не используете mongodb ИЛИ , в ruby ​​(используя mongoid ) вы можете сделать это с помощью

Collection.any_of({:item => a, :item2 => b, item3 => c},{:item => a, :item2 => b},{:item => a, :item3 => c},{:item2 => b, item3 => c})

, что эквивалентно

db.Collection.find({$or:[{item:a,item2:b,item3:c}],[{item:a,item2:b}],[{item:a,item3:c}],[{item2:b,item3:c}]})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...