MongoDB возвращает 6 случайных строк из коллекции

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

вот образец моей коллекции - я использую PHP

{
   "age": "2",
   "breed": "Bengal",
   "dislikes": "Dislikes being patted by people",
   "likes": "Like to purr and get headbutts. Sleeps on our bed, with Woody our dog, and also comes in for food at 6pm, loves Tin fish and is known to meow quite lo [...]",
   "lost": true,
   "pet_lost_date": NumberInt(1361366445),

   "type": "cat" 
}

Я видел это db.items.find().skip(randonNumberHere).limit(1); - MongoDB: извлечение нескольких случайных документов из коллекции

но я этого не понял, все, что я понимаю из этого, это find(), который находит все, skip(), который пропускает количество строк, и limit(), сколько возвращается.

Однако мой вопрос больше о том, чтобы получить всех потерянных питомцев и случайным образом показать только 6

public function lost_pets($no){
        $collection = static::db()->ipet_mypet;
        $pet = $collection->find(array('lost': true, '$where'=> function(){var randomNumber=Math.random(); return this.random>=randomNumber || this.random>randomNumber })).sort(array('pet_lost_date'=> 1)).limit(6);
    }

person RussellHarrower    schedule 21.02.2013    source источник


Ответы (3)


Вы можете использовать это:

db.collection.find({'lost': true, $where: function(){var randomNumber=Math.random(); return this.pet_lost_date>=randomNumber || this.pet_lost_date>randomNumber }}).next();

Find({'lost':true}) извлекает документы с полем 'потерянный': true.

Предложение $where возвращает DBCursor, указывающий на конкретный документ. Вызывая «next()», мы получаем следующий документ, на который указывает курсор. Таким образом, мы получаем один случайный документ за раз.

person Amith Koujalgi    schedule 21.02.2013
comment
Проблема в том, что на самом деле это не дает вам 6 случайных строк. Это дает вам 6 последовательных документов, начиная со случайного смещения. Это означает, что вероятность выбора 6 одинаковых документов дважды = вероятность выбора одного и того же смещения дважды. - person Colin M; 21.02.2013
comment
но это все равно покажет потерянные результаты по порядку. то, что я хочу сделать, это случайные потерянные, которые верны, скажем, у меня 300 потерянных: правда, я хочу показать 6 случайных. - person RussellHarrower; 21.02.2013
comment
@RussellHarrower Чтобы сделать это немного более случайным, вы можете выбрать, например, 12 документов из Монго (вместо 6). Затем в PHP вы можете случайным образом выбрать из этих 12. Затем, даже если вам удастся случайным образом выбрать одно и то же смещение (и, таким образом, получить те же 12 от Mongo) - КРАЙНЕ маловероятно, что ваша рандомизация PHP также выберет одно и то же подмножество 6. - person Colin M; 21.02.2013
comment
@ColinMorelli, не могли бы вы показать пример - я думаю, что понимаю вас, но не уверен на 100% - person RussellHarrower; 21.02.2013
comment
Вы можете использовать это в PHP: - person Amith Koujalgi; 21.02.2013
comment
А для подсчета документов вы можете использовать db.collection.find({'lost':true}).count(); - person Amith Koujalgi; 21.02.2013
comment
Или более эффективный код выдает этот запрос на стороне сервера: db.collection.find({ $where : function(){ var randomNumber=Math.random(); return this.random›=randomNumber || this.random› случайноеЧисло }}).limit(1) - person Amith Koujalgi; 21.02.2013
comment
@AmithKoujalgi Это совсем не быстрее. Первый запрос (я предполагаю) выполнял поиск по индексу по атрибуту lost и возвращал случайное смещение с пределом 6. Ваш запрос теперь требует полного сканирования коллекции по всему набору данных, а также не гарантирует никаких количество результатов. - person Colin M; 21.02.2013
comment
@AmithKoujalgi, не могли бы вы показать свой пример как ответ, который трудно понять в комментариях. - person RussellHarrower; 21.02.2013
comment
@RussellHarrower: я отредактировал свой ответ, вы можете попробовать это и сообщить мне, сработает ли это. Скрещенные пальцы! - person Amith Koujalgi; 21.02.2013
comment
На самом деле вы можете написать собственную логику приложения в блоке $where, чтобы предоставить вам все, что требует ваша логика. - person Amith Koujalgi; 21.02.2013
comment
Мне говорят, что есть ошибка, которая не соответствует моему коду (вашему коду) выше - person RussellHarrower; 21.02.2013
comment
Я не знаком с выдачей запроса в PHP, но приведенный выше запрос отлично работает, когда вы запускаете из оболочки mongo. И ограничение запроса состоит в том, что он извлечет только один случайный документ. - person Amith Koujalgi; 22.02.2013

Согласно тому, как я вижу это логически, простой способ - сохранить записи со случайным числом, а затем отсортировать по этому числу при чтении из БД.

person codeartist254    schedule 09.03.2015

Допустим, у вас есть 20 записей, из которых вы хотите случайным образом выбрать 5 записей.

Мы сгенерируем случайное значение пропуска от 0 до 20 — предельное значение (5) = 15.
При этом мы обязательно вернем 5 записей, даже если случайное значение пропуска начинается с 15.
Мы также можем принудительно пропустить значение равным нулю, если оно становится отрицательным после вычитания случайного значения из общего количества записей

Пример кода:

$total_records = $collection->count(); <br>
$limit = 5; <br>
$skip = mt_rand(0, $total_records);<br>
$collection->find()->skip($skip < 0 ? 0 : $skip)->limit($limit);
person Yannick Ambig    schedule 22.11.2015