我有一个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_id
在 setting
表是一个外键,它指的是十六进制组件 _id
在 site
表.我想让输出结果类似于这样,但我一直没有成功.我只想做数据库查询,目前使用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控制器的后端,我希望创建 "报告",为需要升级的设备提供更多的洞察力,哪些设置不符合我们的 "默认 "配置等等。
如果 site_id
在 setting
集合型 ObjectId
那么你可以试试这个
db.site.aggregate([
{
$lookup: {
from: "setting",
localField: "_id",
foreignField: "site_id",
as: "setting"
}
}
])
你可以在这里测试它 艋舺游乐场
如果 site_id
属于 string
,那么你就不能进行这种查找,因为 _id
和 site_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
希望对你有帮助