如何在MongoDB中加入多个集合(一对多关系)?

时间:2020-05-25 07:31:51

标签: python database mongodb pymongo

我有两个集合:snmpvalues = 'output taken from pysnmp' ### Code not included ### def netstat(request): for line in snmpvalues: if line == '1': return ('Green') ### Network is up ### else: return ('red') ### System is down ### document。其结构如下所示:

citation

我想查询每个文档的引用文档(称为引用,用# document {id:001, title:'foo'} {id:002, title:'bar'} {id:003, title:'abc'} # citation {from_id:001, to_id:002} {from_id:001, to_id:003} 表示)的信息。在SQL中,我将使用to_id表的左联接document,然后左联接citation来获取引用的完整信息(而不仅仅是它们的ID)。

但是,我只能在MongoDB中使用document来实现第一步。这是我的汇总管道:

$lookup

通过此管道,我可以获得以下结果:

[
    {'$lookup':{
        'from': 'citation',
        'localField': 'id',
        'foreignField': 'from_id',
        'as': 'references'
    }}
]

所需的结果是:

{
    id:001,
    title:'foo',
    references:[{from_id:001, to_id:002}, {from_id:001, to_id:003}]
}

我找到了这个answer,但这似乎是一对一的关系,不适用于我的情况。

编辑:有人说在MongoDB中应该避免加入,因为它不是关系数据库。我选择MongoDB是因为它比MySQL快得多。

1 个答案:

答案 0 :(得分:1)

您需要在同一集合上再次使用$unwind$lookup,然后您应$group _id来获得期望的结果。

请尝试以下操作:

[
  {
    "$lookup": {
      "from": "citation",
      "localField": "_id",
      "foreignField": "from_id",
      "as": "references"
    }
  },
  {
    "$unwind": "$references"
  },
  {
    "$lookup": {
      "from": "doc",
      "localField": "references.to_id",
      "foreignField": "_id",
      "as": "map"
    }
  },
  {
    "$unwind": "$map"
  },
  {
    "$project": {
      "_id": 1,
      "title": 1,
      "map_id": "$map._id",
      "map_title": "$map.title"
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "title": {
        "$first": "$title"
      },
     "references": {
        "$push": {
          "id": "$map_id",
          "title": "$map_title"
        }
      }
    }
  }
]