Menu Docs
Página inicial do Docs
/ /

$lookup Estágio (Atlas Data Federation)

As pesquisas permitem filtrar documentos de collections "unidas" em seus bancos de dados para simplificar o processamento de informações co-relacionadas.

Nas instâncias de banco de dados federadas do MongoDB , você pode usar $lookup para executar uma junção externa esquerda de uma collection fragmentada ou não fragmentada do mesmo banco de dados ou de um banco de dados diferente. Você pode aplicar $lookup a collections em qualquer um dos seus armazenamentos de dados federados no Atlas, AWS S3 e HTTP ou HTTPS.

Observação

Para coleções fragmentadas, $lookup o está disponível somente em clusters Atlas executando 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

Nesta página