$lookup

执行左连接到一个集合(unsharded),必须在同一数据库中

$lookup添加了一个新的数组字段,该字段的元素是 joined集合中的匹配文档。

语法

$lookup 语法如下:

  1. {
  2. $lookup:
  3. {
  4. from: <collection to join>, #右集合
  5. localField: <field from the input documents>, #左集合 join字段
  6. foreignField: <field from the documents of the "from" collection>, #右集合 join字段
  7. as: <output array field> #新生成字段(类型array)
  8. }
  9. }
FieldDescription
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下的iteminventory集合的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>操作执行返回结果如下:

  1. {
  2. "_id" : 1,
  3. "item" : "abc",
  4. "price" : 12,
  5. "quantity" : 2,
  6. "inventory_docs" : [
  7. { "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 }
  8. ]
  9. }
  10. {
  11. "_id" : 2,
  12. "item" : "jkl",
  13. "price" : 20,
  14. "quantity" : 1,
  15. "inventory_docs" : [
  16. { "_id" : 4, "sku" : "jkl", "description" : "product 4", "instock" : 70 }
  17. ]
  18. }
  19. {
  20. "_id" : 3,
  21. "inventory_docs" : [
  22. { "_id" : 5, "sku" : null, "description" : "Incomplete" },
  23. { "_id" : 6 }
  24. ]
  25. }

$out

输出到集合

https://docs.mongodb.com/manual/reference/operator/aggregation/out/#example

  1. db.books.aggregate( [
  2. { $group : { _id : "$author", books: { $push: "$title" } } },
  3. { $out : "authors" }
  4. ] )