Я запускаю 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(',') );
}