Получить уникальные случайные предметы из коллекции mongodb? - PullRequest
1 голос
/ 19 декабря 2010

Я запускаю IRC-бот и у меня есть функция, которая возвращает 1 случайный URL-адрес, используя Math.random из моей коллекции Mongodb.

Я хотел бы реорганизовать его так, чтобы он возвращал x количество уникальных элементов, и для каждого последующего вызова команды извлечения url .getlinks Мне бы хотелось, чтобы он сохранял все уникальным, чтобы пользователь не видел ту же ссылку если все возможные ссылки не были возвращены.

Есть ли какой-нибудь алгоритм или встроенная функция mongodb, которую я мог бы использовать для этого?

Вот пример сценария:

У меня в коллекции 9 записей. У них есть поля _id и url.

user a: .getlinks()
bot returns: http://unique-link-1, http://unique-link-2, http://unique-link-3, http://unique-link-4

user a: .getlinks()
bot returns: http://unique-link-5, http://unique-link-6, http://unique-link-7, http://unique-link-8

user a: .getlinks()
bot returns: http://unique-link-9, http://unique-link-6, http://unique-link-1, http://unique-link-3

Справочная информация:

  • Всего около 200 ссылок. По моим оценкам, к концу следующего года число ссылок возрастет до 5000.

В настоящее время я могу думать только о том, чтобы сохранить массив всех возвращенных предметов, а также собрать все предметы из коллекции сразу и получить случайный случай 4 раза, убедившись, что он уникален и еще не был показан.

var shown = [], amountToReturn = 4;
function getLinks() {
   var items = links.find(), returned = [];
   for ( var i = 0; i<amountToReturn; i++ ) {
      var rand = randItem( items );
      if ( shown.indexOf( rand.url ) == -1 && shown.length < items.length ) ) {
         returned.push( rand.url );
      }
   }
   message.say( returned.join(',') );
}

Ответы [ 2 ]

2 голосов
/ 19 декабря 2010

Вы можете найти несколько возможных вариантов, чтобы получить случайные элементы из коллекции здесь ...

http://jira.mongodb.org/browse/SERVER-533

Здесь описан еще один интересный метод ...

http://cookbook.mongodb.org/patterns/random-attribute/

Метод, упомянутый выше, в основном создает новый ключ / значение в документе, используя Math.random ()

> db.docs.drop()
> db.docs.save( { key : 1, ..., random : Math.random() } )
> db.docs.save( { key : 1, ..., random : Math.random() } )
> db.docs.save( { key : 2, ..., random : Math.random() } )
... many more insertions with 'key : 2' ...
> db.docs.save( { key : 2, ..., random : Math.random() } )
...
1 голос
/ 10 февраля 2012

Получить случайные записи из mongodb через карту / уменьшить

// map
function() { 
    emit(0, {k: this, v: Math.random()}) 
}

// reduce
function(k, v) {
  var a = []
  v.forEach(function(x) {
    a = a.concat(x.a ? x.a : x)
  })
  return {a:a.sort(function(a, b) {
    return a.v - b.v;
  }).slice(0, 3 /*how many records you want*/)}; 
}

// finalize
function(k, v) {
  return v.a.map(function(x) {
    return x.k
  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...