我正在为一个新项目设计MongoDB集合架构,对于MongoDB来说,我有一个关于一对多关系的问题。
为了这个例子,让我们假设这种关系是数据中心到服务器的关系,这意味着一个数据中心可以有多个服务器(在应用程序中有数千台服务器),并且服务器只能属于一个数据中心。
最好让Servers._datacenter引用Datacenter._id吗?还是存储服务器ID的Datacenter.servers 数组?
如果建议在数据中心文档中使用数组来引用与其关联的服务器ID.那么,当您只有服务器ID时,是否有一种方法可以找出服务器所属的数据中心呢?(有点像快速的where serverId in Datacenter.servers查询),而不必查询每个数据中心,然后在每个Datacenter.servers数组中检查ID。
如果建议在服务器文档中有一个元素来引用它属于什么数据中心,那么是否有一种方法可以查询数据中心,并返回虚拟Documents.servers数组中所有相关的服务器文档?
我不太确定最好的方法是什么,因为每个数据中心可以有非常多的服务器,我认为最好不要在每个数据中心文档中有这么大的数组。但是,如果我将其设置为每个Server文档中都引用了父数据中心,那么查询就会变得相当困难(或者不是吗?也许有一种很简单的方法我还没有发现,我确实说我是蒙古人的新手)
我正在阅读本文件,它展示了如何以任何方式设置引用方向,它声明:
若要避免可变的、不断增长的数组,请将publisher引用存储在图书文档中。
因此,这使我认为最好是引用服务器文档中的数据中心ID。因此,如果是这样的话,是否有一种方法可以将所有服务器文档作为数据中心文档中的数组返回?或者我必须查询数据中心,然后使用该Datacenter._id查询所有服务器,然后返回一个合并的对象。
发布于 2016-01-25 19:16:39
这将取决于访问模式。正如null1941所说,您计划如何编写这个代码。
如果服务器的数量是10s或数百个,我猜这将是一个,一到几个关系,而不是一对多,这样您就可以继续在服务器中嵌入数据中心。这意味着您将在一次访问和一次查询中获得所需的所有信息。如果您能够保证一致性,这种方法可以工作,但是如果在一个数据中心中存在许多服务器,则最终会出现重复。因此,可以在许多服务器文档中复制数据中心文档。如果您可以再次保证一致性,而且数据中心可能很少有关于它们的信息,那么这种方法就可以工作。这种方法的唯一优点是您只执行一个查询。通常,这种方法是不推荐的;此外,如果您希望将数据中心作为一个单独的文档来处理,那么您需要在它上运行一些操作,而不是避免这种方法。
如果您决定采用这种方法;要将数据中心嵌入为数组,可以使用$all或$in在数组中进行搜索。
示例:
{
"_id" : ObjectId("63546464sad65s4ad3654"),
"name" : "Server1",
"datacenter" : ["gamma", "500"]
}查询:
db.users.find({ "datacenter": { $in: [ "gamma", "delta" ] } } )如果您决定将服务器作为文档嵌入(您可以将数据中心文档以及服务器内的数据中心文档嵌入到服务器中,两者都可以工作)。因此,在数据中心文档中嵌入服务器时,可以使用点表示法在嵌入文档中搜索。示例:(servers是字典,name是服务器内部的一个属性):
{
"_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中,单个文档不应该超过16 go。如果通过嵌入可以超出此大小,则应该采用拆分方法(如下)。
现在,更好的方法是,而不是嵌入;基本上就像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 } } )在拥有了所有的服务器之后,您可以循环遍历每个服务器并检查状态或其他内容。最后,服务器变量中将包含服务器文档。
我希望这能帮上忙
发布于 2016-01-25 18:35:51
最好在服务器文档中引用数据中心is。要检索具有指定数据中心ID的服务器,只需查询服务器集合。查询并不困难,如下所示:
var dataID = datacenter._id
db.servercollection.find({ datacenter: dataID }, function(err, servers) {
});https://stackoverflow.com/questions/34999422
复制相似问题