2016-01-06 116 views
16

$lookup是MongoDB 3.2中的新增功能。它对同一数据库中的未加注集合执行左外部联接,以过滤“已加入”集合中的文档进行处理。

要使用$lookupfrom集合不能被分割。

另一方面,分片是一种有用的水平缩放方法。

一起使用它们的最佳做法是什么?

+0

$ lookup阶段需要在数据库的主分片上运行。由于“from”集合也不分片,因此它位于同一台服务器上,并且可以在本地执行连接。你应该避免连接不同的机器。这是NoSQL ;-)我可以想象没有好的解决方案。你想在应用程序中迭代结果还是想存储它?在第一种情况下,也许你必须在每个文档的循环中查找操作。在第二种情况下,您可以使用MapReduce:http://tebros.com/2011/07/using-mongodb-mapreduce-to-join-2-collections/ – yoooshi

回答

14

正如您引用的文档所指出的,您不能在分片集合上使用$lookup。所以最佳实践解决方法是在独立查询中自己执行查找。

  1. 执行您的aggregate查询。
  2. 将查询结果中的“localField”值拉到数组中,可能使用Array#map
  3. 使用类似{foreignField: {$in: localFieldArray}}
  4. 的查询对“from”集合执行find查询将您的结果合并为任何您需要的格式。

不要让$lookup限制阻止您从需要扩展性的分片集合中自行执行查找功能。

+0

因此,目前'$ lookup'是相当有限的? –

+1

我不会那么远;它仍然是一个强大的工具,因为能够从服务器端提取引用数据的能力仍然非常有用。但是,无法从分片收集中提取数据是一个关键限制。 – JohnnyHK