草庐IT

mongodb - 在 MongoDB 中模拟关系

coder 2023-05-04 原文

作为最受欢迎的 NoSQL 解决方案之一,MongoDB 具有这种方法的大部分优势。但我仍在努力解决的一个问题是如何在 NoSQL 数据存储中反射(reflect)对象关系,特别是 MongoDB。

例如,让我们考虑一个简单的数据模型:用户、帖子和评论。我很清楚,评论本身没有值(value),因此成为帖子的嵌入对象。但是当涉及到用户时 - 这变得很棘手,因为用户本身就是一个实体,而不是与 Post 耦合。现在,如果我需要在网页上列出带有用户全名和个人资料链接的帖子,我需要有一个帖子列表和有关帖子作者的信息(至少名称和 ID)。

我在这里看到了 2 个可能的解决方案:

  1. 对数据进行反规范化,使每个帖子条目都包含其作者 ID 和全名(以及列出帖子时我可能需要的任何其他用户属性)。这样我可以让查询数据变得非常简单,但是当用户更新他/她的个人资料时,我也需要更新用户的所有帖子。但是我还需要将用户属性存储在评论对象中,这意味着更新用户个人资料本质上需要我更新所有至少有一条用户评论的帖子,除非我想将评论存储在单独的集合中。
  2. 仅在帖子对象中存储用户 ID 并运行 2 个查询:一个用于获取帖子列表,另一个用于获取用户 ID 在帖子作者列表中的用户列表。这需要在我的应用程序代码中进行 2 次查询和额外处理才能将用户映射到帖子。

我确定我不是第一个面临这个问题的人,但不幸的是,到目前为止我还没有找到任何关于这个主题的最佳实践。意见?

最佳答案

两者都是有效的解决方案,解决方案 1 的优点是您可以显示这样的页面,只从数据库中检索一个文档。用户不会经常更新他们的个人资料,您可以在更改用户个人资料后异步更新所有帖子和嵌入的评论。您可以索引用户 ID 上的帖子和嵌入式评论,因此更新应该很快。在 mongodb 中更新非常快速,因为 mongodb 会进行就地更新,并且您无法回滚或提交,因此 mongodb 不必记录更改。

但是,像 stackoverflow 这样的网站上的用户也有声誉,而且这种声誉的变化比他们的个人资料要大得多。

解决方案 2 需要每页检索更多文档,但是您可以将 $in 运算符与用户 ID 列表(post 的用户 ID + 评论的用户 ID)一起使用,因此您只需要两个“选择语句”。

关于mongodb - 在 MongoDB 中模拟关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3013027/

有关mongodb - 在 MongoDB 中模拟关系的更多相关文章

  1. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  2. 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列,在这种情况下

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

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

  4. ruby-on-rails - 在这种情况下我如何模拟一个对象?没有明显的方法可以用模拟替换对象 - 2

    假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl

  5. ruby - "public/protected/private"方法是如何实现的,我该如何模拟它? - 2

    在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定

  6. ruby - 在 RSpec 中 stub /模拟全局常量 - 2

    我有一个gem,它有一个根据Rails.env的不同行为的方法:defself.envifdefined?(Rails)Rails.envelsif...现在我想编写一个规范来测试这个代码路径。目前我是这样做的:Kernel.const_set(:Rails,nil)Rails.should_receive(:env).and_return('production')...没关系,只是感觉很丑。另一种方法是在spec_helper中声明:moduleRails;end而且效果也很好。但也许有更好的方法?理想情况下,这应该有效:rails=double('Rails')rails.sho

  7. ruby - Rails 组合多个 activerecord 关系 - 2

    我想合并多个事件记录关系例如,apple_companies=Company.where("namelike?","%apple%")banana_companies=Company.where("namelike?","%banana%")我想结合这两个关系。不是合并,合并是apple_companies.merge(banana_companies)=>Company.where("namelike?andnamelike?","%apple%","%banana%")我要Company.where("名字像?还是名字像?","%apple%","%banana%")之后,我会写代

  8. ruby-on-rails - rspec 模拟对象属性赋值 - 2

    我有一个rspec模拟对象,一个值赋给了属性。我正在努力在我的rspec测试中满足这种期望。只是想知道语法是什么?代码:defcreate@new_campaign=AdCampaign.new(params[:new_campaign])@new_campaign.creationDate="#{Time.now.year}/#{Time.now.mon}/#{Time.now.day}"if@new_campaign.saveflash[:status]="Success"elseflash[:status]="Failed"endend测试it"shouldabletocreat

  9. ruby-on-rails - Ruby on Rails - has_one 关系,如何检查它是否具有现有关联? - 2

    我有一个简单的问题,与关联有关。我有一个书的模型,它有_onereservation。预订属于_书本。我想在预订Controller的创建方法中确保在预订时没有预订一本书。换句话说,我需要检查该书是否存在任何其他预订。我该怎么做?编辑:Aaa我做到了,感谢大家的提示,学到了一些新东西。当我尝试提供的解决方案时,出现no_method错误或nil_class等。这让我开始思考,我尝试处理的对象根本不存在。Krule给了我使用book.find的想法,所以我尝试使用它。最终我得到了它的工作:book=Book.find_by_id(reservation_params[:book_id])

  10. ruby - 如何使用 rspec stub /模拟对命令行的调用? - 2

    我正在尝试测试命令行工具的输出。如何使用rspec来“伪造”命令行调用?执行以下操作不起作用:it"shouldcallthecommandlineandreturn'text'"do@p=Pig.new@p.should_receive(:run).with('my_command_line_tool_call').and_return('resulttext')end如何创建stub? 最佳答案 使用newmessageexpectationsyntax:规范/虚拟规范.rbrequire"dummy"describeDummy

随机推荐