$lookup
Nesta página
Definição
O $lookup executa uma união externa esquerda do fluxo de mensagens do seu $source
para uma coleção Atlas no seu Registro de Conexão.
Dependendo do seu caso de uso, um estágio de pipeline do $lookup
utiliza uma das três sintaxes a seguir:
Para saber mais, consulte Sintaxe $lookup.
Aviso
Usar $lookup
para enriquecimento de um fluxo pode reduzir a velocidade de processamento do fluxo.
O seguinte formulário protótipo ilustra todos os campos disponíveis:
{ "$lookup": { "from": { "connectionName": "<registered-atlas-connection>", "db": "<registered-database-name>", "coll": "<atlas-collection-name>" }, "localField": "<field-in-source-messages>", "foreignField": "<field-in-from-collection>", "let": { <var_1>: <expression>, <var_2>: <expression>, …, <var_n>: <expression> }, "pipeline": [ <pipeline to run> ], "as": "<output-array-field>" } }
Sintaxe
O estágio $lookup
recebe um documento com os seguintes campos:
Campo | Tipo | necessidade | Descrição |
---|---|---|---|
from | documento | Obrigatório | Documento que especifica uma collection em um banco de dados Atlas para unir às mensagens do seu $source . Você deve especificar uma collection no seu Registro de Conexão. Você deve especificar um valor para todos os campos neste documento. |
from.connectionName | string | Obrigatório | Nome da conexão no registro de conexões. |
from.db | string | Obrigatório | Nome do banco de dados do Atlas que contém a coleção que você deseja unir. |
from.coll | string | Obrigatório | Nome da coleção da qual você deseja participar. |
localField | string | Condicional | Campo a partir de suas mensagens Este campo faz parte das seguintes sintaxes: |
foreignField | string | Condicional | Campo de documentos na coleção Este campo faz parte das seguintes sintaxes: |
let | documento | Condicional | |
gasoduto | documento | Condicional | Especifica o Este campo faz parte das seguintes sintaxes: |
como | string | Obrigatório | Nome do novo campo de array a ser adicionado aos documentos de entrada. Este novo campo de array contém os documentos correspondentes da coleção from . Se o nome especificado já existir como campo no documento de entrada, esse campo será substituído. |
Comportamento
A versão Atlas Stream Processing de $lookup executa uma junção externa esquerda de mensagens de seu $source
e os documentos em uma collection especificada do Atlas. Essa versão se comporta de forma semelhante ao estágio $lookup
disponível em um banco de dados MongoDB padrão. No entanto, esta versão exige que você especifique uma coleção do Atlas do seu Registro de Conexão como o valor para o campo from
.
O pipeline pode conter uma fase $lookup
aninhada. Se você incluir uma fase $lookup
aninhada em seu pipeline, utilize a sintaxe from
padrão para especificar uma coleção na mesma conexão remota do Atlas que a fase $lookup
externa.
Exemplo
$lookup : { from: {connectionName: "dbsrv1", db: "db1", coll: "coll1"}, …, pipeline: [ …, { $lookup: { from: "coll2", …, } }, …, ] }
Se o seu pipeline tiver $lookup
e $merge
na mesma coleção, os resultados do Atlas Stream Processing poderão variar se você tentar manter uma exibição incremental. O Atlas Stream Processing processa várias mensagens de origem simultaneamente e, em seguida, as mescla todas. Se várias mensagens tiverem o mesmo ID, que $lookup
e $merge
usam, o Atlas Stream Processing poderá retornar resultados que ainda não foram materializados.
Exemplo
Considere o seguinte fluxo de entrada:
{ _id: 1, count: 2 } { _id: 1, count: 3 }
Suponha que sua query contenha o seguinte dentro do pipeline:
{ ..., pipeline: [ { $lookup on _id == foreignDoc._id from collection A } { $project: { _id: 1, count: $count + $foreignDoc.count } } { $merge: { into collection A } } ] }
Se estiver tentando manter uma visualização gradual, o resultado poderá ser semelhante ao seguinte:
{ _id: 1, count: 5 }
No entanto, o Atlas Stream Processing pode retornar uma contagem de 5
ou 3
, dependendo se o Atlas Stream Processing processou os documentos.
Para obter mais informações, consulte $lookup
.