在MongoDB中连接两个集合

3

我是一个mongoDB的初学者。我有两个集合,分别是Book和Author。它们都有相同的列名[name和workswritten]。我需要使用内连接(inner join)来排除Book和Author中的一些列。就像这个SQL查询语句:

select book.name,book.editions,book.characters,author.name 
from dbo.book book 
inner join dbo.author author on book.name=author.works_written

我需要在MongoDB中执行相同的查询。使用map/reduce吗?


可能是如何在MongoDB中执行SQL Join等效操作?的重复问题。 - sidgate
5个回答

2

MongoDB不支持JOIN操作。当您需要此功能时,必须通过查询两个集合来自己实现它。

因此,使用嵌入而不是链接通常是一个好的策略。

Map/Reduce作业通常是非常昂贵的操作。仅应偶尔用于数据挖掘目的。


我需要知道如何使用MapReduce函数来完成它。 - Rudra

2
我需要使用MapReduce函数来完成此操作。
在MR中,db对象已经被弃用了很长时间,因此无法在MR中同时对两个表进行操作。
不过还有另一种解决方案:使用两个MR。首先在第一个集合上运行MR并输出到所需的集合中,然后使用第二个MR将输出到相同的集合中,使用out选项(如reducemerge)将两个集合“连接”起来。
当然,这样做会很慢,因此更好的方式是避免这样做。至于:
select book.name,book.editions,book.characters,author.name 
from dbo.book book 
inner join dbo.author author on book.name=author.works_written

这个查询可以通过从书籍集合流式传输游标,然后在迭代每本书时快速地将其固定到数据库中(在MongoDB中这样做是可以的),并获取作者的详细信息。

您还可以从书籍中获取一组作者ID,然后一次性查询作者集合,并在客户端上对两者进行排序。


1
尝试这个:-
db.book.aggregate([
    {
      $lookup:
        {
          from: "author",
          localField: "name",
          foreignField: "works_written",
          as: "nameWorkData"
        }
   }
])

1

Mongodb不是关系型数据库,因此在这里无法进行任何类型的连接。连接很难扩展。

Mongodb实现连接的常见方法是数据去规范化。在您的情况下,您可以将作者名称去规范化到书籍表中。然后您的查询将不需要连接。这是一个模式示例:

book
{
  _id,
  name,
  editions,
  characters,
  author_name
} 

请注意,每次更新作者集合时,您需要在书籍集合中更新author_name
另一种解决方案是为每本书添加作者姓名的附加请求,但这将导致速度变慢。

我需要知道如何使用MapReduce函数来完成它。 - Rudra
@ Rudra:您不能在两个集合之间运行m / r。再说一遍--mongodb不支持任何类型的连接,我在我的答案中列出了所有可能的解决方案。如果您需要连接,请使用SQL数据库。在mongodb中,您只能使用一个集合进行游戏并执行所需的任何操作。 - Andrew Orsich

1
你可以比较以下 SQL 和 MongoDB(NoSQL)的代码:
  • SQL Code:

     SELECT *, [output array field]
          FROM collection
          WHERE [output array field] IN (SELECT *
                FROM [collection to join]
                WHERE [foreignField]= [collection.localField]);
    
  • mongoDB (NoSQL):

     {
        $lookup:
          {
            from: [collection to join],
            localField: [field from the input documents],
            foreignField: [field from the documents of the "from" collection],
            as: [output array field]
          }
     }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接