2017-02-19 14 views
1

Я пытаюсь использовать конвейер агрегации на mongodb для извлечения 3 случайных документов.

$sample был идеален, за исключением того, что возвращенные документы не гарантированы уникальными.

Любые идеи о том, как генерировать 3 уникальных документа в ответ? Я предполагаю, что это потребует дальнейшего использования конвейера агрегации, как я не уверен.

Это, конечно, предполагается, что в коллекции есть 3 или более документов.

Спасибо.

ответ

1

Что вы можете сделать, это запрос больше данных, скажем, 100 $sample «d документов, группировать эти документы по _id для удаления дубликатов (уникальность) и ограничить выход к желаемому числу документов:

db.test.aggregate([{ 
    $sample: { size: 100 } 
}, { 
    $group: { 
     _id: "$_id", 
     document: { $push: "$$ROOT" } 
    } 
}, { 
    $limit: 3 
}]) 
+0

Спасибо за ваш ответ. Предполагается, что моя коллекция имеет размер 100 или более, чтобы начать, на самом деле я на самом деле выращиваю свою коллекцию из 0 и хотел бы получить 3 документа на каждой новой записи. Я знаю, что означает обработку первых 3 записей в качестве специального случая ... Любые другие идеи? благодаря – Adam

0

Кажется, этот вопрос был фактически построен неверным предположением, основанным на том, как я тестировал.

$sample возвращает уникальные записи, по определению, я просто отправлял одни и те же запросы и не понял, что база данных была перенаселена с помощью этого же запроса. При проверке объектные идентификаторы на самом деле были уникальны, что позволило решить проблему (которая, по общему признанию, вообще не существовала).