原生MongoDB查询使用ObjectID作为外域连接2张表。

问题描述 投票:0回答:1

我有一个Mongo数据库,不是我创建的,但需要从中提取一些额外的数据。 我可以访问数据库,并且可以查看和查询这些表,但我一直无法将两个表连接起来,以便在我的查询输出中提供所有必要的信息。

我有2个我感兴趣的表。第一个设置,它的文档看起来像这样(被截断)。

{
   "_id" : ObjectId("5aff382669153dc20edf945a"),
   "key" : "mgmt",
   "site_id" : "5aff382669153dc20edf9456",
   "advanced_feature_enabled" : false,
   "auto_upgrade" : true
}

和site,看起来像这样(被截断)。

{
   "_id" : ObjectId("5aff382669153dc20edf9456"),
   "desc" : "Joe's Crab Shack",
}

site_idsetting 表是一个外键,它指的是十六进制组件 _idsite 表.我想让输出结果类似于这样,但我一直没有成功.我只想做数据库查询,目前使用Robo 3T,而不是使用脚本或编程。

{
"_id" : ObjectId("5aff382669153dc20edf9456"),
"desc" : "Joe's Crab Shack",
"setting" : [
                "_id" : ObjectId("5aff382669153dc20edf945a"),
                "key" : "mgmt",
                "site_id" : "5aff382669153dc20edf9456",
                "advanced_feature_enabled" : false,
                "auto_upgrade" : true
            ]
}

我希望能够只进行数据库查询,目前使用Robo 3T,而不必求助于脚本或编程。 最接近我所期望的结果是下面。 这个查询返回的结果是 site 文件,以及所有 setting 的文件,但没有 site_id 外键。

db.site.aggregate([
{
    $lookup:
    {
        from: "setting",
        localField:"_id.str",
        foreignField:"site_id",
        as: "setting"
    }
}
])

我确信我漏掉了一些简单的东西,但我对MongoDB非常陌生,而且由于SQL和Mongo之间的术语差异,我有点迷茫。 对于任何想知道的人来说,数据库实际上是一个大型多站点Ubiquiti控制器的后端,我希望创建 "报告",为需要升级的设备提供更多的洞察力,哪些设置不符合我们的 "默认 "配置等等。

mongodb mongodb-query robo3t
1个回答
0
投票

如果 site_idsetting 集合型 ObjectId那么你可以试试这个

db.site.aggregate([
  {
    $lookup: {
      from: "setting",
      localField: "_id",
      foreignField: "site_id",
      as: "setting"
    }
  }
])

你可以在这里测试它 艋舺游乐场

如果 site_id 属于 string,那么你就不能进行这种查找,因为 _idsite_id 在类型上也应该匹配(ObjectIds),所以你可以改变 setting 模式,以使 site_id 类型 ObjectId 并指 site 模式

而不是这样

site_id: String

用这个

site_id: { type: ObjectId, ref: 'site' }

更新

如果site_id是一个字符串,而你又无法改变设置模式,那么我们可以做一些工作来解决。

我们可以在聚合管道中为站点文档添加一个新的属性,它将存储文档的_id,但不是ObjectId,而是一个字符串。

这样

db.site.aggregate([
  {
    $addFields: {
      siteIdString: { // this is the stringified version of the _id
        $toString: "$_id"
      }
    }
  },
  {
    $lookup: {
      from: "setting",
      localField: "siteIdString", // then use this string id in lookup stage
      foreignField: "site_id",
      as: "setting"
    }
  }
])

你可以在这里测试 Mongo Playground2

希望对你有帮助

© www.soinside.com 2019 - 2024. All rights reserved.