MongoDB произвольно агрегирует документы (уникальные результаты) - PullRequest
1 голос
/ 10 июля 2019

Я читал, что можно использовать db.collection.aggregate с $sample для получения случайных документов из коллекции.Но я также читал, что $ sample НЕ на 100% надежен, поэтому я написал этот запрос:

db.blog.aggregate(
   {"$sample": { "size": 100 } }, 
   {"$group": { "_id" : "$post_id", "post" : { "$push" : "$$ROOT" }}}
)

Да, я пытаюсь сгруппировать, но проблема в том, что в циклестановится более сложным, чем следует, т.е. при запросе результатов из MongoDB.

Любые предложения приветствуются, спасибо заранее.

РЕДАКТИРОВАТЬ: Я хочу знать, необходима ли группировка для получения уникальных результатов, или есть лучший способ сделать это.НЕ имеет смысла использовать $ group для агрегата, чтобы вернуть мне несколько случайных документов из MongoDB, которые являются уникальными и не являются дубликатами.

ДА, я установил уникальный идентификатор INDEX в фактической коллекции.

Ответы [ 2 ]

3 голосов
/ 16 июля 2019

Если у вас есть уникальный индекс над полем post_id, то нет необходимости групповой операции после выборки.

См .: https://docs.mongodb.com/manual/core/read-isolation-consistency-recency/#faq-developers-isolate-cursors

1 голос
/ 11 июля 2019

Хорошо, давайте начнем с выяснения проблемы уникальности $ sample, поскольку она не так проста, как вы думаете.

Сначала давайте рассмотрим условия $ sample, как указано в документации:

  1. $ образец первой очереди трубопровода

  2. N составляет менее 5% от общего количества документов в собрании

  3. Сборник содержит более 100 документов

Если эти условия не выполняются, Mongo выполнит сканирование коллекции с сортировкой и выбором случайных документов (в этом случае дубликатов не будет).

Предполагая, что эти условия выполнены, повторяющиеся идентификаторы могут возникать с помощью чего-то, называемого изоляция курсора . Это может произойти только в том случае, если у вас есть операции обновления / удаления в коллекции, которые могут «портиться» с ее индексацией.

Итак, если вы находитесь в этом последнем случае, и ваша коллекция обновляется, пока вы запрашиваете ее, тогда группирование - это ваш лучший снимок, если вы хотите на 100% гарантировать, что дубли не будут возвращены. (с учетом того, что указанная группировка по 100 документам - это небольшие издержки, о которых стоит беспокоиться).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...