$lookup
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.
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" }, }, ] )