这将取决于访问模式。您打算如何将其编码为 null1941 所说的。
如果服务器的数量为 10 或数百台,我想这将是一对少的关系,而不是一对多的关系,因此您可以继续将数据中心嵌入服务器中。这意味着您将在一次查询中获得所需的所有信息。如果您可以保证一致性,这种方法可能会奏效,但鉴于一个数据中心中存在许多服务器,您最终会出现重复。因此数据中心文档可以在许多服务器文档中复制。如果您再次可以保证一致性并且数据中心可能没有关于它们的信息,那么这种方法可以工作。这种方法的唯一优点是您只执行一个查询。一般不推荐这种方式; 此外,如果您想将数据中心视为一个单独的文档,以便对其运行一些操作而不是避免这种方法。
如果您决定采用这种方法;将数据中心嵌入为数组 您可以使用$all或$in在数组内进行搜索。
例子:
{
"_id" : ObjectId("63546464sad65s4ad3654"),
"name" : "Server1",
"datacenter" : ["gamma", "500"]
}
询问:
db.users.find({ "datacenter": { $in: [ "gamma", "delta" ] } } )
如果您决定将服务器作为文档嵌入(您也可以将数据中心文档嵌入到服务器中,两者都可以工作)。因此,对于在数据中心文档中嵌入服务器,您可以使用点符号在嵌入文档中进行搜索。示例:(服务器是字典,名称是服务器内部的属性):
{
"_id" : ObjectId("63546464sad65s4ad3654"),
"name" : "gamma",
"servers" : [
{
"title" : "server1",
"speed" : "3.2GHZ",
"ram" : "200GB"
},
{
"title" : "server2",
"speed" : "3.2GHZ",
"ram" : "64GB"
}
]
}
询问:
db.datacenters.find( { "servers.title": "server1" }
你再判断。但是,您决定这样做,在 mongodb 中有一种方法可以检索您需要的信息。
现在请记住,如果您决定在数据中心文档中嵌入服务器,那么在 mongodb 中,单个文档不应超过 16MB。如果通过嵌入可以超过这个大小,你应该采用拆分方法(如下)。
现在对您来说更好的方法是不嵌入的情况;基本上正如 gnerkus 所说。但是请记住,在 mongodb 中没有外键约束,您必须确保使用应用程序的一致性。这样数据中心集合中的 server_id 可以在服务器集合中找到(反之亦然)。您还可以将 datacenter_id 放在服务器集合中;我决定选择哪一个的方式是我的用例。例如,如果我的大部分操作都在数据中心上,我将向其中添加 server_id。如果我的大部分操作都在服务器集合上,我将向其中添加 datacenter_id。在这两种情况下,您都将执行两个或多个查询。这是一个例子:
数据中心文档示例
{
_id : ObjectId("10001000010000"),
name : 'Gamma',
location: 'pluto',
servers: [
ObjectID('1212'),
ObjectID('1213')
]
}
服务器文档示例:
{
_id : ObjectId("1212"),
name : 'Server1',
ram: '250GB',
type: 'processing',
status: 'running'
}
在这种情况下,您可以查询为:首先您获得所需的数据中心(假设名称是唯一的)
datacenter = db.datacenter.findOne({name: "Gamma"})
然后您将查询您需要的服务器的详细信息;获取上面给定数据中心中所有服务器的示例
servers = db.servers.find({_id: { $in : datacenter.servers } } )
拥有所有服务器后,您可以遍历每个服务器并检查状态或其他内容。您最终将在服务器变量中拥有服务器文档。
我希望这会有所帮助