草庐IT

node.js - 有效的 mongodb + Mongoose 。架构设计

coder 2023-10-29 原文

我是 mongodb 和 nosql 数据库的新手。我非常感谢对我的架构设计提供一些输入/帮助,这样我就不会搬起石头砸自己的脚。

数据:我需要为Quote建模。一个 Quote 包含许多 Ttem。每个 Item 包含许多 Order。每个 Order 都与特定的财政季度相关联。 例如。我有一个包含 ItemQuote,它在 Q3-14、Q4-14、Q1-15 中有 OrderOrder最多 future 12 个季度(3 年)。具体来说,我在为 Order-quarter 绑定(bind)建模时遇到了问题。我正在尝试对数据进行非规范化并嵌入 Quote <->Item <->Order 以提高性能。

尝试/想法:

  1. 有一个包含yearqNum 字段的Order 架构。在每个 Item 中嵌入一组 Orders。还可以创建虚拟 qKey 字段以通过字符串设置/获取,如 Q1-14
  2. 创建一个散列,使用 Q1-14 等键将 Order 嵌入到 Item 中。这很好,但 Mongoose 本身不支持。
  3. 在每个 Quote 中存储当前(基础)季度,并让每个 Item 包含一个 Order 数组,但将它们编入索引通过#quarters 从基准季度偏移。 IE。如果当前是第 1-14 季度,并且收到第 4-14 季度的订单,则将其存储在数组位置 2 中。

我完全偏离了标记吗?在我努力有效地使用 Mongo 时,任何建议都会受到赞赏。谢谢

最佳答案

Disclaimer: I've embarked on this simply as a challenge to myself. See the <rant> below for an explanation as to why I disagree with your approach.

牢牢掌握 No-SQL 的第一步是摒弃“非规范化”等术语——它们根本不适用于基于文档的数据存储。另一个需要理解的重要概念是没有 JOINS在 MongoDB 中,因此您必须完全改变您对数据的看法才能进行调整。

使用 mongoose 解决问题的最佳方法是分别设置报价单和项目的集合。然后我们可以在这些集合之间设置引用,将文档“链接”在一起。

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var quoteSchema = new Schema({
  items: [{ type: Schema.Types.ObjectId, ref: 'Item' }]
});

var itemSchema = new Schema({});

处理您的报价 -> 项目“关系”。要设置 Orders,您可以使用您所指示的嵌入式文档数组,但是如果您决定开始查询/索引 Orders,您将在没有桨的情况下沿着某条小溪前进.同样,我们可以通过引用来解决这个问题:

var itemSchema = new Schema({
  orders: [{ type: Schema.Types.ObjectId, ref: 'Order' }]
});

var orderSchema = new Schema({
  quarter: String
});

现在你可以使用 population 来获得你需要的东西:

Item
  .findById(id)
  .populate({
    path: 'orders',
    match: { quarter: 'Q1-14' }
  })
  .exec(function (err, item) {

    console.log(item.orders); // logs an array of orders from Q1-14

  });

引用的问题在于您实际上是用读取指令访问数据库两次,一次是为了找到父文档,然后一次是为了填充它的引用。

您可以在这里阅读更多关于引用文献和人口的信息:http://mongoosejs.com/docs/populate.html

<rant>

为什么您应该坚持使用 RDBMS 处理此类数据,我可以继续讲几个小时。 Especially when the defense for the choice is a lack of an ORM and Mongo being "all the rage."工程师为解决方案选择最好的技术,而不是因为某种技术正在流行。这是周末黑客和创建企业级产品之间的区别。不要误会我的意思,这并不是要破坏 No-SQL——我维护的最大代码库是基于 NodeJS 和 MongoDB 构建的。但是,我选择了这些技术,因为它们是解决我基于文档的问题的正确技术。如果我的数据是像您这样的关系订购系统,我会立刻放弃 Mongo。

</rant>

关于node.js - 有效的 mongodb + Mongoose 。架构设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21145338/

有关node.js - 有效的 mongodb + Mongoose 。架构设计的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  4. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  5. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  6. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  7. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  8. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

    是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

  9. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  10. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

随机推荐