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.
Sintaxe
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> } }
from Objeto de campo
Campo | Tipo | Descrição | necessidade |
|---|---|---|---|
| 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 |
| string | O nome da collection. | Obrigatório |
Exemplos
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.
Exemplo básico
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" } } )
Exemplo aninhado
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" }, }, ] )