2

我是 mongoDB 的初学者。我有两个收藏书和作者。[姓名和著作]分别是常用栏。使用内部联接,我必须发出 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 中执行相同的查询。映射/减少?

4

5 回答 5

2

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

出于这个原因,使用嵌入而不是链接通常是一个很好的策略。

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

于 2012-09-24T11:39:45.833 回答
2

我需要如何使用 mapreduce 函数来做到这一点。

db对象在 MR 中已被弃用很长时间,因此不可能在 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,然后一次查询所有作者集合,并在客户端对两者进行排序。

于 2012-09-25T13:48:46.957 回答
1

mongodb 不是关系数据库——因此这里不可能进行任何类型的连接。连接很难扩展。

mongodb中实现join的常用方式是数据非规范化。在您的情况下,您可以将作者姓名非规范化为书表。那么您的查询将不需要加入。这是架构示例:

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

author_name请记住,每次更新作者收藏时,您都需要更新图书收藏。

另一种解决方案——每本书的作者姓名的附加请求,但它的工作速度会慢得多。

于 2012-09-24T11:40:38.563 回答
1

尝试这个:-

db.book.aggregate([
    {
      $lookup:
        {
          from: "author",
          localField: "name",
          foreignField: "works_written",
          as: "nameWorkData"
        }
   }
])
于 2016-04-07T10:03:03.870 回答
0

您可以比较 SQL 和 mongoDB (NoSQL) 的以下代码:

  • SQL 代码:

     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]
          }
     }
    
于 2020-07-20T04:17:13.163 回答