MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Amostra aleatória do MongoDB retornando resultados altamente distorcidos


A partir do MongoDB 3.4.9, parte do motivo do viés que você observou é que $sample depende quase inteiramente da implementação do cursor aleatório do mecanismo de armazenamento (consulte SERVER-19183 ). Isso é feito para que $sample pode ter bom desempenho quando a coleção contém muitos dados. No entanto, como o mecanismo de armazenamento armazena documentos em uma ordem de classificação usando uma implementação do tipo árvore B, nem sempre é possível criar um resultado realmente aleatório.

Existem atualmente duas solicitações de recursos para melhor $sample mecânica, ou seja, SERVER-22069 e SERVER-22068 .

Dito isto, se você precisar de amostras verdadeiramente imparciais de seus dados, rolando seu próprio $sample -like é provavelmente a melhor maneira de proceder neste momento. Algo como:
  1. Obter uma lista de todos os _id na coleção.
  2. Faça uma amostragem aleatória nesta lista (por exemplo, usando o random) do Python .escolha ).
  3. Obtenha todos os documentos relevantes usando a amostra _id , que terá um desempenho razoável dependendo do tamanho da amostra que você deseja, pois _id é sempre indexado.