Docs Menu

$lookup

MongoDB サーバー $lookupは、シャーディングされていないコレクションの左外部結合を同じデータベース内のシャーディングされていないコレクションに実行します。 ルックアップを使用すると、"join" コレクションのドキュメントをフィルタリングして処理することができるため便利です。

フェデレーティッドデータベースインスタンスでは、$lookup を使用して、 Atlas 、 Amazon Web Services S3HTTPまたはHTTPSデータストア の同じデータベースまたは異なるデータベースからのシャーディングされたコレクションとシャーディングされていないコレクションを結合できます。

注意

シャーディングされたコレクションの場合、 $lookupは MongoDB 5.1以降を実行している Atlas クラスターでのみ使用できます。

$lookup構文については、MongoDB サーバー マニュアルを参照してください。

Data Federation では、from$lookup フィールドは次の代替構文をとります。これにより、任意のデータベース名と必須のコレクション名を含むオブジェクトを指定できます。

{
$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>
}
}
フィールド
タイプ
説明
必要性

db

string

データベース名。

データベース名を指定すると、Data Federation は指定されたデータベース内の コレクションからデータを読み取ります。 コマンドが動作しているデータベースとは異なるデータベース名を指定する場合は、ネストされたすべての$lookupステージでもこのデータベース名を指定する必要があります。

$lookupステージ内でデータベース名を指定しない場合、ステージ内のコレクションは、最も近い親$lookupステージで指定されたデータベース名(存在する場合)、または コマンドが動作しているデータベースの名前を継承します。

条件付き

coll

string

コレクション名。

必須

たとえば、 sourceDB1sourceDB2sourceDB3という名前の 3 つのデータベースがあり、次のコレクションが含まれているとします。

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 }
])

次の例では、 $lookup集計ステージを使用して、1 つのコレクションのドキュメントを他のデータベース内のコレクションのドキュメントと結合します。

sourceDB1.ordersコレクションに対する次の集計操作は、 ordersコレクションのitemフィールドとcatalogskuフィールドを使用して、 ordersコレクションのドキュメントとsourceDB2.catalogコレクションのドキュメントを結合します。 コレクション:

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

sourceDB1.ordersコレクションに対する次の集計操作は、orders sourceDB2.catalogsourceDB3.warehousesコレクションのitem ordersフィールドを使用して、 コレクションのドキュメントとsku catalogコレクションのドキュメント、および コレクションのドキュメントを結合します。 コレクションの フィールドと、 コレクションの フィールドと フィールドstock_iteminstockwarehouses

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