草庐IT

node.js - 一对多 Mongoose 关系 - 在哪里存储引用

coder 2023-10-29 原文

我正在为一个新项目设计 MongoDB 集合架构,作为 MongoDB 的新手,我有一个关于一对多关系的问题。

为了这个例子,假设关系是Datacenter-to-Servers,这意味着一个Datacenter可以有多个服务器(数千个,不限于应用程序),并且这些服务器只能属于一个Datacenter。

最好让 Servers._datacenter 引用 Datacenter._id 吗?还是一个Datacenter.servers array 来存储服务器ID?

如果您建议在数据中心文档中使用数组 来引用与之相关联的服务器 ID... 那么有没有一种方法可以在您拥有时找出服务器属于哪个数据中心服务器ID? (有点像快速的 where serverId in Datacenter.servers 查询)而不必查询每个数据中心,然后检查每个 Datacenter.servers 数组中的 ID

如果您建议在服务器文档中使用一个元素来引用它所属的数据中心,那么有没有办法查询数据中心,并在虚拟 Documents.servers 数组或其他内容中返回所有关联的服务器文档?

我不太确定最佳路线是什么,因为每个数据中心可能有非常大量的服务器,我认为最好不要在每个数据中心文档中包含这么大的数组。 .. 但是如果我设置它以便每个服务器文档都在其中引用父数据中心,这会使查询变得相当困难(或者不是?也许有一种我还没有发现的非常简单的方法,我确实说过我是Mongo 的新手)

我正在通读 this document ,它显示了如何以任何一种方式设置引用方向,并指出:

To avoid mutable, growing arrays, store the publisher reference inside the book document

所以我认为最好在服务器文档中引用数据中心 ID。如果是这样的话,有没有办法将所有服务器文档作为数据中心文档中的数组返回?或者我是否必须查询数据中心,然后查询具有该数据中心的所有服务器。_id,然后返回合并的对象..

最佳答案

这取决于访问模式。如 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 } } )

在您拥有所有服务器之后,您可以遍历每个服务器并检查状态或其他内容。您最终会将服务器文档保存在服务器变量中。

希望对你有帮助

关于node.js - 一对多 Mongoose 关系 - 在哪里存储引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34999422/

有关node.js - 一对多 Mongoose 关系 - 在哪里存储引用的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - 一个 YAML 对象可以引用另一个吗? - 2

    我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的ruby​​yaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir

  3. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  4. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  5. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  6. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  7. ruby - Chef LW 资源属性默认值如何引用另一个属性? - 2

    我正在尝试将一个资源属性的默认值设置为另一个属性的值。我正在为我正在构建的tomcat说明书定义一个资源,其中包含以下定义。我想要可以独立设置的“名称”和“服务名称”属性。当未设置服务名称时,我希望它默认为为“名称”提供的任何内容。以下不符合我的预期:attribute:name,:kind_of=>String,:required=>true,:name_attribute=>trueattribute:service_name,:kind_of=>String,:default=>:name注意第二行末尾的“:default=>:name”。当我在Recipe的新block中引用我

  8. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  9. ruby-on-rails - ActiveRecord::Associations::CollectionProxy 从哪里获取.each 实例方法? - 2

    假设我有模型Topics和Posts,其中Topichas_many:posts和Postbelongs_to:topic。此时我的数据库中已经有了一些东西。如果我进入Rails控制台并输入Topic.find(1).posts我相信我得到了一个CollectionProxy对象。=>#]>我可以对此调用.each以获得枚举器对象。=>#]:each>我对CollectionProxy如何处理.each感到困惑。我意识到它在某些时候是继承的,但我一直在阅读API文档,他们并没有说得很清楚CollectionProxy是从什么继承的,除非我遗漏了一些明显的东西。Thispage似乎并没有

  10. ruby - 如何打印出 Mechanized 存储的 cookie? - 2

    我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject

随机推荐