我还没有准备好放手,这就是我重新思考问题并编辑 Q 的原因(原文如下)。
我在周末项目中使用 mongoDB,它需要数据库中的一些关系,这就是痛苦的全部原因:
我有三个收藏:
Users
Lists
Texts
用户可以拥有文本和列表 - 列表“包含”文本。文本可以在多个列表中。
我决定使用单独的集合(不是嵌入),因为子文档并不总是出现在其父文档的上下文中(例如,所有文本,不在列表中)。
所以需要做的是使用这些列表引用属于某些列表的文本。可以有无限的列表和文本,但相比之下列表会更少。
与我最初想到的不同,我还可以将引用放在每个文本文档中,而不是列表文档中的所有文本 ID。它实际上会有所作为,因为我可以通过一个查询来查找列表中的每个片段。甚至可以索引该引用。
var TextSchema = new Schema({
_id: Number,
name: String,
inListID: { type : Array , "default" : [] },
[...]
文本出现在 MANY 列表中的情况也很少见,因此数组不会真正爆炸。不过,问题仍然存在,是否有可能使用 mongoDB 进行扩展或实际上是一种更好的实现方式?限制文本可以包含的列表数量(可能)是否有帮助?有少数关系的秘诀吗?
获得对已完成此操作以及如何实现的项目的引用(很少:很多关系)甚至会很棒。我不敢相信一旦需要一些关系,每个人都会回避 mongo DB。
我将把它分解为我目前看到的两个问题: 1) 假设一个列表由 5 个文本组成。如何引用列表中包含的文本?只需打开一个数组并将文本的 _ids 存储在其中吗?似乎这些阵列可能会增长到月球并返回,从而减慢应用程序的速度?另一方面,文本需要在没有列表的情况下可用,因此嵌入并不是真正的选择。如果我想获取包含 100 个文本的列表的所有文本怎么办......听起来像两个查询和一个包含 100 个字段的数组:-/。那么这种引用方式是否正确?
var ListSchema = new Schema({
_id: Number,
name: String,
textids: { type : Array , "default" : [] },
[...]
问题 2)我看到这种方法是在删除文本时清理引用。它的引用仍将在包含文本的每个列表中,我不想遍历所有列表以清除那些死引用。或者我会?有没有聪明的方法来解决这个问题?只是让文本包含引用(它们在哪个列表中)只会解决问题,所以这不是一个选项。
我想我不是第一个遇到此类问题的人,但我也无法找到关于如何“正确”解决问题的明确答案。
我还对有关此类引用(多对多?),尤其是可扩展性/性能的最佳实践的一般想法感兴趣。
最佳答案
关系通常不是一个大问题,尽管涉及关系的某些操作可能是。这在很大程度上取决于您要解决的问题,并且很大程度上取决于结果集的基数和键的选择性。
我写了a simple testbed生成遵循典型长尾分布的数据。事实证明,MongoDB 在关系方面通常比人们想象的要好。
毕竟和关系型数据库只有三个区别:
$in 的手动子查询在 $in 子句中确实可以扩展到数千个项目,当然前提是引用值被索引了如果您需要执行大型连接,即如果您的查询是真正的关系查询并且您需要相应地连接 大量 数据,那么 MongoDB 可能不适合。但是,关系数据库中所需的许多连接并不是真正关系的,它们是必需的,因为您必须将对象拆分为多个表,例如因为它包含一个列表。
“真正的”关系查询的一个示例可能是“找到所有购买产品的客户,这些客户在 6 月份的营业额排名靠前的客户的评价超过 4 星”。除非您有一个非常专业的架构,基本上是为支持此查询而构建的,否则您很可能需要找到所有订单,按客户 ID 对它们进行分组,获取前 n 个结果,使用这些使用 $in 查询评级并使用另一个 $in 来查找实际客户。不过,如果您可以将自己限制在顶部,比如 6 月份的 10k 客户,那么这就是三个往返和一些快速的 $in 查询。
只要 RAM 中的索引支持您的查询并且网络没有完全拥塞,这在典型的云硬件上可能会在 10-30 毫秒的范围内。在这个例子中,如果数据太稀疏,事情就会变得一团糟,即前 10k 用户几乎没有写过超过 4 星的评论,这将迫使你编写足够聪明的程序逻辑来不断迭代第一步,这既复杂又缓慢,但如果这是一个如此重要的场景,那么无论如何可能会有更适合的数据结构。
关于node.js - 不同集合中文档之间的MongoDB关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30459764/
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下: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列,在这种情况下
英文版英文链接关注公众号在“亚特兰蒂斯的回声”中踏上一段难忘的冒险之旅,深入未知的海洋深处。足智多谋的考古学家AriaSeaborne偶然发现了一件古代神器,揭示了一张通往失落之城亚特兰蒂斯的隐藏地图。在她神秘的导师内森·兰登教授的指导和勇敢的冒险家亚历克斯·默瑟的帮助下,阿丽亚开始了一段危险的旅程,以揭开这座传说中城市的真相。他们的冒险之旅带领他们穿越险恶的大海、神秘的岛屿和充满陷阱和谜语的致命迷宫。随着Aria潜在的魔法能力的觉醒,她被睿智勇敢的QueenNeria的幻象所指引,她让她为即将到来的挑战做好准备。三人组揭开亚特兰蒂斯令人惊叹的隐藏文明,并了解到邪恶的巫师马拉卡勋爵试图利用其古
//1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)
由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A