As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
$lookup
O estágio $lookup de agregação no Amazon DocumentDB permite que você realize uma junção externa esquerda entre duas coleções. Essa operação permite combinar dados de várias coleções com base nos valores de campo correspondentes. É particularmente útil quando você precisa incorporar dados de coleções relacionadas aos resultados da consulta.
Parâmetros
-
from: O nome da coleção com a qual realizar a junção. -
localField: O campo dos documentos de entrada a serem comparados comforeignFieldo. -
foreignField: O campo dos documentos nafromcoleção a ser comparado comlocalFieldo. -
as: o nome do novo campo a ser adicionado aos documentos de saída contendo os documentos correspondentes dafromcoleção. -
pipeline: Opcional selocalFieldeforeignFieldforem especificados. Um pipeline de agregação para ser executado nafromcoleção. O pipeline retorna documentos dafromcoleção. Para retornar todos os documentos, especifique um pipeline vazio[]. O pipeline não pode incluir os$mergeestágios$outou. Consulte Condições de junção e subconsultas correlacionadas (MongoDB Shell). -
let: opcional. Um documento que define variáveis a serem usadas naspipelineetapas. Use as expressões variáveis para acessar os campos dos documentos de entrada que estão unidos aopipeline. Para referenciar uma variável nos estágios do pipeline, use a"$$<variable>"sintaxe. Consulte Condições de junção e subconsultas correlacionadas (MongoDB Shell).
Exemplo (MongoDB Shell)
O exemplo a seguir demonstra uma $lookup operação simples que une dados da orders coleta à customers coleção.
Crie documentos de amostra
db.customers.insertMany([ { _id: 1, name: "Alice" }, { _id: 2, name: "Bob" }, { _id: 3, name: "Charlie" } ]); db.orders.insertMany([ { _id: 1, customer_id: 1, total: 50 }, { _id: 2, customer_id: 1, total: 100 }, { _id: 3, customer_id: 2, total: 75 } ]);
Exemplo de consulta
db.customers.aggregate([ { $lookup: { from: "orders", localField: "_id", foreignField: "customer_id", as: "orders" } } ]);
Saída
[
{
_id: 1,
name: 'Alice',
orders: [
{ _id: 2, customer_id: 1, total: 100 },
{ _id: 1, customer_id: 1, total: 50 }
]
},
{ _id: 3, name: 'Charlie', orders: [] },
{
_id: 2,
name: 'Bob',
orders: [ { _id: 3, customer_id: 2, total: 75 } ]
}
]
Condições de junção e subconsultas correlacionadas (MongoDB Shell)
Novo na versão 8.0.2.
Além de uma única igualdade de igualdade, $lookup no Amazon DocumentDB é possível executar um pipeline de agregação na coleção unida. Isso suporta subconsultas não correlacionadas, que executam a mesma subconsulta para cada documento de entrada, e subconsultas correlacionadas, que usam variáveis definidas nos campos de cada documento de entrada para retornar resultados correlacionados a esse documento.
Sintaxe
Para executar uma subconsulta correlacionada, defina variáveis dos campos do documento de entrada com let e faça referência a elas nas pipeline etapas:
{ $lookup: { from: <collection to join>, let: { <var_1>: <expression>, ..., <var_n>: <expression> }, pipeline: [ <pipeline to run on the joined collection> ], as: <output array field> } }
Parâmetros
-
let: um documento que define variáveis dos campos dos documentos de entrada. Para referenciar uma variável nos estágios do pipeline, use a"$$<variable>"sintaxe. As variáveis podem ser acessadas pelos estágios dopipeline, incluindo$lookupestágios adicionais aninhados nopipeline. Um$matchestágio requer o uso do$exproperador para acessar as variáveis. Omitaletpara executar uma subconsulta não correlacionada. -
pipeline: O pipeline de agregação a ser executado nafromcoleção. O pipeline não pode acessar diretamente os campos dos documentos de entrada; em vez disso, defina variáveislete faça referência às variáveis. Para retornar todos os documentos, especifique um pipeline vazio[].
Os operadores $eq$gt,$gte,$lt, e de $lte comparação colocados em um $expr operador dentro de um $match estágio podem usar um índice na from coleção quando comparam um campo da coleção unida com uma let variável ou constante.
Crie documentos de amostra
db.customers.insertMany([ { _id: 1, name: "Alice", min_total: 60 }, { _id: 2, name: "Bob", min_total: 50 }, { _id: 3, name: "Charlie", min_total: 20 } ]); db.orders.insertMany([ { _id: 1, customer_id: 1, total: 50 }, { _id: 2, customer_id: 1, total: 100 }, { _id: 3, customer_id: 2, total: 75 } ]);
Exemplo de consulta
O exemplo a seguir une cada cliente com seus pedidos e mantém somente os pedidos que total são maiores ou iguais ao min_total valor do próprio cliente. A condição de junção e o filtro por cliente são as duas let variáveis de referência em: $expr
db.customers.aggregate([ { $lookup: { from: "orders", let: { customer_id: "$_id", min_total: "$min_total" }, pipeline: [ { $match: { $expr: { $and: [ { $eq: [ "$customer_id", "$$customer_id" ] }, { $gte: [ "$total", "$$min_total" ] } ] } } }, { $project: { _id: 0, total: 1 } } ], as: "qualifying_orders" } } ]);
Saída
[
{ _id: 1, name: 'Alice', min_total: 60, qualifying_orders: [ { total: 100 } ] },
{ _id: 2, name: 'Bob', min_total: 50, qualifying_orders: [ { total: 75 } ] },
{ _id: 3, name: 'Charlie', min_total: 20, qualifying_orders: [] }
]
Para cada cliente, a subconsulta é avaliada com min_total os valores _id e valores desse cliente, de modo que cada documento receba seu próprio resultado correlacionado.
Subconsultas correlacionadas usando sintaxe concisa (MongoDB Shell)
Novo na versão 8.0.2.
O Amazon DocumentDB também oferece suporte à sintaxe concisa de subconsultas correlacionadas, que combina a correspondência de igualdade em e com a. localField foreignField pipeline A sintaxe concisa elimina a exigência de expressar a correspondência de igualdade dentro de um $expr operador em um $match estágio.
Sintaxe
{ $lookup: { from: <collection to join>, localField: <field from the input documents>, foreignField: <field from the documents of the "from" collection>, let: { <var_1>: <expression>, ..., <var_n>: <expression> }, pipeline: [ <pipeline to run> ], as: <output array field> } }
Exemplo de consulta
O exemplo a seguir retorna os mesmos resultados do exemplo anterior de subconsulta correlacionada. A igualdade entre _id e customer_id é expressa com localField e foreignField em vez de uma $expr condição:
db.customers.aggregate([ { $lookup: { from: "orders", localField: "_id", foreignField: "customer_id", let: { min_total: "$min_total" }, pipeline: [ { $match: { $expr: { $gte: [ "$total", "$$min_total" ] } } }, { $project: { _id: 0, total: 1 } } ], as: "qualifying_orders" } } ]);
Saída
[
{ _id: 1, name: 'Alice', min_total: 60, qualifying_orders: [ { total: 100 } ] },
{ _id: 2, name: 'Bob', min_total: 50, qualifying_orders: [ { total: 75 } ] },
{ _id: 3, name: 'Charlie', min_total: 20, qualifying_orders: [] }
]
Estágios suportados em subconsultas correlacionadas
Quando um $lookup pipeline usalet, os seguintes estágios podem fazer referência às "$$<variable>" variáveis:
$match(usando o$exproperador)$project$addFields$set$group$bucket$bucketAuto$sortByCount$lookup(aninhada)$graphLookup
Estágios que não avaliam expressões variáveis, como$sort,$skip,$limit,$count,$sample, e $unwind$unset, também podem ser usados no pipeline, mas não podem referenciar as variáveis.
Os seguintes estágios não são suportados em um $lookup pipeline que usalet: $facet$redact,$replaceRoot, $replaceWith$geoNear,$setWindowFields,$fill, e $match com$text.
Restrições
-
pipelineNão podem incluir os$mergeestágios$outou.
Exemplos de código
Para ver um exemplo de código para usar o $lookup comando, escolha a guia do idioma que você deseja usar:
Exemplos de códigos de subconsulta correlacionados
Para ver um exemplo de código para usar o $lookup estágio com uma subconsulta correlacionada (usando let epipeline), escolha a guia do idioma que você deseja usar: