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

Obtenha valores distintos da matriz com base nas condições da matriz


Condições de consulta com .distinct() aplicam-se à "seleção de documentos" e não às entradas da matriz contidas "dentro" do documento. Se você precisar "filtrar" o conteúdo da matriz, aplique .aggregate() em vez disso, bem como um pouco de pós-processamento para obter apenas os "valores" na resposta da matriz.
db.collection.aggregate([
  { "$match": { "_id": "TEST" } },
  { "$unwind": "$payload" },
  { "$match": { "payload.status": { "$in": ["TRUE","FALSE"] } } },
  { "$group": { "_id": "$payload._id" } },
]).map( d => d._id );

As partes principais são o $unwind estágio de pipeline que você faz principalmente porque deseja que os valores de dentro do array usem posteriormente como a chave para $grupo sobre. Isso essencialmente produz um novo documento para cada membro da matriz, mas cada documento contém apenas esse membro da matriz. Está "desnormalizando" as estruturas do MongoDB que contêm matrizes.

A próxima coisa é o seguinte $match pipeline, que funciona como qualquer consulta e seleciona apenas os documentos que correspondem às condições. Como todos os membros da matriz agora são "documentos", as entradas não correspondentes (como documentos) são excluídas. Você pode usar alternativamente $filter para extrair enquanto ainda é uma matriz, mas como precisamos de $unwind para o próximo estágio podemos simplesmente $match .

Neste ponto, você só fica com as entradas da matriz que correspondem às condições. O $group é obter valores "distintos", então normalmente você faria isso em uma seleção mais ampla do que apenas um único documento ou qualquer coisa em que os valores aqui ainda não fossem distintos. Portanto, isso é apenas manter o mesmo comportamento de .distinct() intacto.

Por fim, como a saída de .aggregate() difere do design de .distinct() na medida em que retorna "documentos" nos resultados, simplesmente usamos o .map() método para processar os resultados do cursor e retornar apenas os "valores" da propriedade específica do documento como uma "matriz".