Как мне загрузить случайный документ из CouchDB (эффективно и справедливо)?

Мне потребовалось немного времени, чтобы понять, потому что я обернул свой внутренний ul в собственный тег li, а не в тег li, к которому был прикреплен мой внутренний ul. Если вы обернете свой внутренний ul в собственный тег li, вы получите дополнительную ненужную пулю.

<ul>
 <li>Item 1</li>
 <li>Item 2</li>
 <li>item 3</li>
 <li>Item 4</li>
 <li>Item 5 has sub items:
      <ul>
          <li>Sub Item 1</li>
          <li>Sub Item 2</li>
      </ul>
 </li>
 <li>Item 6</li>
 <li>Item 7</li>
</ul>
11
задан Christian Berg 23 September 2010 в 14:48
поделиться

1 ответ

Подход 2b: Порядковый номер в Документе

Этот подход подобен для Приближения к 2 упомянутым в [1 115] этот ответ . Тот Подход 2 случайных числа использования дважды (однажды в самом документе и однажды в процессе выбора документа). Этот Подход 2b будет только использовать случайные числа на выборе, обрабатывают и используют последовательные целые числа на документах. Обратите внимание, что это не будет работать, если документы будут удалены (см. ниже). Вот то, как это работает:

Добавляют последовательные целые числа к Вашим документам во время создания:

{
    _id: "4f12782c39474fd0a498126c0400708c",
    int_id : 0,
    // actual data...
}

другой документ

{
    _id: "a498126c0400708c4f12782c39474fd0",
    int_id : 1,
    // actual data...
}

и просто подсчитывают одним с каждым документом.

представление random имеет ту же функцию карты (хотя Вы могли бы хотеть изменить ее имя на что-то другое, чем "случайный"):

 function(doc) {
   if (doc.int_id) {
     emit(doc.int_id, doc);
   }
 }  

Это шаги для загрузки случайного документа:

  • Находят общее количество документов N в представлении путем вызова:
    http://localhost:5984/db/_design/d/_view/random
  • Выбор случайное число 0 <= r < 1
  • Вычисляют случайный индекс: i = floor(r*N)
  • Загрузка документ:
    http://localhost:5984/db/_design/d/_view/random?startkey=i&limit=1

Этот путь мы выбрали ровное распределение int_id от [1 110] до [1 111] дизайном. Затем мы выбираем случайный индекс (между 0 и N-1) и используем его на этом даже распределение.

Примечание

Этот подход не работает больше, когда документы в середине или вначале удалены. Эти int_id должен запуститься в [1 113] и подойти N-1.

0
ответ дан 3 December 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: