$lookup
执行左连接到一个集合(unsharded),必须在同一数据库中
$lookup添加了一个新的数组字段,该字段的元素是 joined
集合中的匹配文档。
语法
$lookup 语法如下:
{
$lookup:
{
from: <collection to join>, #右集合
localField: <field from the input documents>, #左集合 join字段
foreignField: <field from the documents of the "from" collection>, #右集合 join字段
as: <output array field> #新生成字段(类型array)
}
}
Field | Description |
---|---|
from | 右集合,指定在同一数据库中执行连接的集合。此集合不能shared分片。 |
localField | 指定左集合(db.collectionname)匹配的字段。如果左集合不包含localField,$lookup 视为null值来匹配。 |
foreignField | 指定from集合(右集合)用来匹配的字段。如果集合不包含该字段,$lookup 视为null值来匹配。 |
as | 指定要添加到输入文档的新数组字段的名称。新的数组字段包含from集合中匹配的文档。如果在文档中指定的名称已经存在,现有的领域覆盖。 |
实例
使用$lookup集合连接
左集合 orders
内容如下
db.orders.insert([
{ "_id" : 1, "item" : "abc", "price" : 12, "quantity" : 2 },
{ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1 },
{ "_id" : 3 }
])
另外一个右集合 inventory
内容如下:
db.inventory.insert([
{ "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 },
{ "_id" : 2, "sku" : "def", description: "product 2", "instock" : 80 },
{ "_id" : 3, "sku" : "ijk", description: "product 3", "instock" : 60 },
{ "_id" : 4, "sku" : "jkl", description: "product 4", "instock" : 70 },
{ "_id" : 5, "sku": null, description: "Incomplete" },
{ "_id" : 6 }
])
以下聚合操作对 orders左集合
左连接 inventory右集合
,通过 orders下的item
与 inventory集合的sku
:
值得注意:
- 两个集合必须在同一个
db
, orders
是左集合,左连接;- item是
orders
左集合字段; - sku是
inventory
右集合字段 item
为null, 左连接, 右集合sku
为null
db.orders.aggregate([
{
$lookup:
{
from: "inventory",
localField: "item",
foreignField: "sku",
as: "inventory_docs"
}
}
]).pretty()
</div>
操作执行返回结果如下:{
"_id" : 1,
"item" : "abc",
"price" : 12,
"quantity" : 2,
"inventory_docs" : [
{ "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 }
]
}
{
"_id" : 2,
"item" : "jkl",
"price" : 20,
"quantity" : 1,
"inventory_docs" : [
{ "_id" : 4, "sku" : "jkl", "description" : "product 4", "instock" : 70 }
]
}
{
"_id" : 3,
"inventory_docs" : [
{ "_id" : 5, "sku" : null, "description" : "Incomplete" },
{ "_id" : 6 }
]
}
$out
输出到集合
https://docs.mongodb.com/manual/reference/operator/aggregation/out/#example
db.books.aggregate( [
{ $group : { _id : "$author", books: { $push: "$title" } } },
{ $out : "authors" }
] )