代码之家  ›  专栏  ›  技术社区  ›  TK.

MongoDB和“连接”[副本]

  •  162
  • TK.  · 技术社区  · 15 年前

    我相信MongoDB不会正式支持“加入”。这是什么意思?

    我想如果我们把价值 _id 收藏A到 other_id

    如果我的理解是正确的,那么MongoDB可以将两个表连接在一起,例如,当我们运行查询时。这是通过“参考”来完成的 http://www.mongodb.org/display/DOCS/Schema+Design .

    我很想知道答案,因为这对学习MongoDB模式设计至关重要。

    11 回复  |  直到 15 年前
        1
  •  100
  •   Atif Aziz    12 年前

    它不是join,因为只有在需要时才会计算关系。另一方面,join(在SQL数据库中)将解析关系并返回它们,就像它们是一个表一样(您可以“将两个表合并为一个表”)。

    您可以在此处阅读有关DBRef的更多信息: http://docs.mongodb.org/manual/applications/database-references/

    有两种可能的解决方案可用于解析引用。一种是手动操作,正如您所描述的那样。只需将文档的id保存到另一个文档的其他id中,然后编写自己的函数来解决关系。另一个解决方案是使用上面手册中描述的DBRefs,这将使MongoDB解决关系 客户端

        2
  •  53
  •   Clayton Gulick    10 年前

    从Mongo 3.2开始,这个问题的答案不再正确。添加到聚合管道的新$lookup运算符基本上与左外部联接相同:

    https://docs.mongodb.org/master/reference/operator/aggregation/lookup/#pipe._S_lookup

    从文档中:

    {
       $lookup:
         {
           from: <collection to join>,
           localField: <field from the input documents>,
           foreignField: <field from the documents of the "from" collection>,
           as: <output array field>
         }
    }
    
        3
  •  31
  •   dm.    15 年前

    数据库不进行联接,也不在文档之间进行自动“链接”。但是你可以自己做客户端。如果您需要做2,这是可以的,但如果您必须做2000,客户机/服务器的周转次数将使操作缓慢。

    考虑一下经典的ORDER,ORDER-LINEITEM示例。一个订单和8个行项目是关系型的9行;在MongoDB中,我们通常只将其建模为一个BSON文档,它是一个带有嵌入行项目数组的订单。因此在这种情况下,不会出现连接问题。然而,订单可能有一个客户,这个客户可能是一个单独的集合——客户可以从订单文档中读取cust_id,然后根据需要单独获取它。

    我相信mongodb.org网站上有一些关于模式设计的视频和幻灯片。

        4
  •  12
  •   Hello World    11 年前

    mongoDB中的一种连接查询,是在一个集合中请求匹配的id,将id放入一个列表(id list)中,并在另一个(或同一个)集合中使用$in:idlist

    u = db.friends.find({"friends": something }).toArray()
    idlist= []
    u.forEach(function(myDoc) { idlist.push(myDoc.id ); } )
    db.family.find({"id": {$in : idlist} } )
    
        5
  •  6
  •   Ian Mercer    15 年前

    链接到的第一个示例显示了MongoDB引用的行为非常类似于延迟加载,而不是连接。两个集合上都没有发生查询,而是先查询一个集合,然后通过引用查找另一个集合中的项。

        6
  •  6
  •   Salah Saleh    9 年前

    mongoDB不是关系型的,这导致了 some people to consider it useless 我认为在设计数据库之前你应该知道你在做什么。如果选择使用noSQL DB,比如MongoDB,那么最好实现一个模式。这将使您的集合(或多或少)类似于SQL数据库中的表。此外,避免非规范化(嵌入),除非出于效率原因而有必要。

    如果您想设计自己的noSQL数据库,我建议您查看 Firebase

    正如其他人指出的,除了 Meteor (一个Javascript框架),您可以在服务器端使用 package (我不知道还有什么框架能让你这么做)。不过,我建议你读这个 article

    编辑28.04.17: 最近Firebase发布了这个 excellent series 关于noSql数据库的设计。它们还突出显示在 one of the episodes

        7
  •  1
  •   pfrank    12 年前

    考虑使用猫鼬?它使您能够在mongo数据上进行连接。

        8
  •  1
  •   Daniel Kmak    11 年前

    如果您使用mongoose,您可以使用(假设您使用的是子文档和填充):

    Profile.findById profileId
      .select 'friends'
      .exec (err, profile) ->
        if err or not profile
          handleError err, profile, res
        else
          Status.find { profile: { $in: profile.friends } }, (err, statuses) ->
            if err
              handleErr err, statuses, res
            else
              res.json createJSON statuses
    

    它检索 Statuses 属于其中一个 Profile ( profileId Profiles . 架构 friends 定义:

    schema = new mongoose.Schema
      # ...
    
      friends: [
        type: mongoose.Schema.Types.ObjectId
        ref: 'Profile'
        unique: true
        index: true
      ]
    
        9
  •  1
  •   Aouidane Med Amine    11 年前

    您可以使用MongoDB插件,它是greate,并允许连接、合并和创建查询构建器 试试看: https://github.com/petersirka/mongodb-addons

        10
  •  0
  •   Utsav T    10 年前

    作为MongoDB的用户,我不得不频繁地从相关集合中获取数据。当人们将关系型数据库的数据存储到NoSQL数据库中时,“连接”就变得非常必要了。这里有一个库,我和我的朋友一起用Python执行Mongo连接-

    https://pypi.python.org/pypi/mongojoin/1.0.0

    代码不太复杂,值得一试!

        11
  •  0
  •   Community Mohan Dere    9 年前

    我正在使用Mongoose和Express框架。有一个功能叫做 Population 代替连接。

    docs .

    MongoDB中没有连接,但有时我们仍然希望引用其他集合中的文档。这就是人口的来源。

    StackOverflow answer 显示了一个关于如何使用它的简单示例。