Menu Docs
Página inicial do Docs
/
MongoDB Atlas
/ / /

$lookup

Nesta página

  • Sintaxe
  • from Objeto de campo
  • Exemplos
  • Exemplo básico
  • Exemplo aninhado

O servidor MongoDB $lookup executa uma união externa esquerda de uma collection não fragmentada com outra collection não fragmentada no mesmo banco de dados. As pesquisas são úteis, pois permitem filtrar documentos da coleção "unida" para processamento.

Na instância do reconhecimento de data center federado, você pode usar $lookup para unir collection fragmentadas e não fragmentadas do mesmo reconhecimento de data center ou de diferentes reconhecimento de data center do Atlas, Amazon Web Services S3 e armazenamentos de dados HTTP ou HTTPS .

Observação

Para collections fragmentadas, o $lookup está disponível somente em clusters Atlas que executam o MongoDB 5.1 e posterior.

A sintaxe $lookup é descrita no manual do servidor MongoDB.

No Data Federation, o campo from em $lookup tem a seguinte sintaxe alternativa. Isso permite que você especifique um objeto que contém um nome de reconhecimento de data center opcional e um nome de collection obrigatório:

{
$lookup: {
localField: "<fieldName>",
from: <collection-to-join>|{db: <db>, coll: <collection-to-join>},
foreignField: "<fieldName>",
as: "<output-array-field>",
}
}
{
$lookup: {
from: <collection to join>|{db: <db>, coll: <collection-to-join>},
let: { <var_1>: <expression>,, <var_n>: <expression> },
pipeline: [ <pipeline to execute on the collection to join> ],
as: <output array field>
}
}
Campo
Tipo
Descrição
necessidade
db
string

O nome do banco de dados.

Se você especificar um nome de banco de dados, o Data Federation lerá dados da coleção no banco de dados especificado. Se você especificar um nome de banco de dados diferente do banco de dados no qual o comando está operando, todos os estágios $lookup aninhados também deverão especificar esse nome de banco de dados.

Se você não especificar um nome de banco de dados em um estágio $lookup , as collections no estágio herdarão o nome do banco de dados especificado no estágio pai $lookup mais próximo, se ele existir, ou o nome do banco de dados no qual o comando está operando.

Condicional
coll
string
O nome da collection.
Obrigatório

Suponha que haja três reconhecimento de data center denominados sourceDB1, sourceDB2 e sourceDB3 com as seguintes collection:

db.orders.insertMany([
{ "_id" : 1, "item" : "almonds", "price" : 12, "quantity" : 2 },
{ "_id" : 2, "item" : "pecans", "price" : 20, "quantity" : 1 },
{ "_id" : 3 }
])
db.catalog.insertMany([
{ "_id" : 1, "sku" : "almonds", "description": "product 1" },
{ "_id" : 2, "sku" : "bread", "description": "product 2" },
{ "_id" : 3, "sku" : "cashews", "description": "product 3" },
{ "_id" : 4, "sku" : "pecans", "description": "product 4" },
{ "_id" : 5, "sku": null, "description": "Incomplete" },
{ "_id" : 6 }
])
db.warehouses.insertMany([
{ "_id" : 1, "stock_item" : "almonds", "warehouse": "A", "instock" : 120 },
{ "_id" : 2, "stock_item" : "pecans", "warehouse": "A", "instock" : 70 },
{ "_id" : 3, "stock_item" : "cashews", "warehouse": "B", "instock" : 60 },
{ "_id" : 4, "stock_item" : "bread", "warehouse": "B", "instock" : 80 },
{ "_id" : 5, "stock_item" : "cookies", "warehouse": "A", "instock" : 80 }
])

Os exemplos a seguir usam o estágio de agregação $lookup para unir documentos de uma coleção aos documentos da coleção em outros bancos de dados.

A operação de aggregation a seguir na sourceDB1.orders collection une os documentos da orders collection com os documentos da sourceDB2.catalog collection usando o item campo da orders collection e o sku campo da catalog collection:

db.getSiblingDb("sourceDB1").orders.aggregate(
{
$lookup: {
from: { db: "sourceDB2", coll: "catalog" },
localField: "item",
foreignField: "sku",
as: "inventory_docs"
}
}
)

A seguinte operação de agregação na sourceDB1.orders coleção une os documentos da orders coleção com os documentos da sourceDB2.catalog coleção e os documentos da sourceDB3.warehouses coleção usando o item campo da orders coleção , o sku campo da catalog collection e os stock_item instock campos e da warehouses collection :

db.getSiblingDb("sourceDB1").orders.aggregate(
[
{
$lookup: {
from: db: "sourceDB2", coll: "catalog",
let: { "order_sku": "$item" },
pipeline: [
{
$match: {
$expr: {
$eq: ["$sku", "$$order_sku"]
}
}
},
{
$lookup: {
from: db: "sourceDB3", coll: "warehouses",
pipeline: [
{
$match: {
$expr:{
$eq : ["$stock_item", "$$order_sku"]
}
}
},
{
$project : { "instock": 1, "_id": 0}
}
],
as: "wh"
}
},
{ "$unwind": "$wh" },
{
$project : { "description": 1, "instock": "$wh.instock", "_id": 0}
}
],
as: "inventory"
},
},
]
)

Voltar

$collStats

Próximo

$merge