node.js - 有效的mongodb + mongoose模式设计

  显示原文与译文双语对照的内容

我是mongodb和 NoSQL 数据库的新手。 我真的非常感谢一些输入/帮助,我的模式设计,所以我不在脚上拍摄自己。

数据: 我需要模型 Quote 。 一个 Quote 包含许多 Ttem 。 每个 Item 包含许多 Order 。 每个 Order 都绑定到一个特定的会计季度。 有一个 Quote,我有一个包含 Order 在Q3-14中,Q4-14,Q1-15,的ItemOrder 只在未来的future quarters 12. 具体来说,我对建模 Order -quarter绑定的Having 问题。 我正在尝试denormalize数据和嵌入 Quote <- Item的<- Order的性能。

的尝试/想法:

  1. 包含包含 yearqNum 字段的Order 架构。 在每个 Item 中嵌入 Orders的array 。 也可以创建虚拟 qKey 字段,用于设置/通过字符串( 如 Q1-14 )
  2. 创建一个散列,将 Order 嵌入到 Item 中,使用诸如 Q1-14 之类的键。 这将很好,但在Mongoose中不支持本机。
  3. 将当前( 基) 季度存储在每个 Quote 中,并且每个 Item 都包含 Order s的array,但它们由基本季度的#quarters 偏移。 换句话说,如果当前是 Q1-14,并且订单进入 Q4-14,则将它的存储在 array 位置 2中。

我是不是完全了? 当我努力使用Mongo时,任何建议都是值得感激的。 谢谢你

时间: 作者:

我已经对自己做了一个挑战。 关于为什么我不同意你的方法的解释,请参见 <rant> below 。

要掌握 NoSQL的第一步是引发类似"denormalize"的术语- - 它们只是不应用于基于文档的数据存储。 另一个要理解的重要概念是在MongoDB中没有 JOINS,所以你必须改变你想要完全调整数据的方式。

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


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

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

var itemSchema = new Schema({});

处理你的报价-> 项"关系"。 你可以在没有embedded的情况下使用嵌入文档的array,但是如果你决定开始查询/索引命令,你就会在没有paddle的情况下 be 。 同样,我们可以用引用来解决这个问题:


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

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

现在你可以使用填充来获得所需的信息:


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 。 特别是当对于选择的防御是缺乏一个ORM和"所有的愤怒。"工程师选择解决方案的最佳技术。 周末hackery与创建企业级产品的区别。 不要错误,这不是对于垃圾回收器 NoSQL - 我维护的最大代码库是NodeJS和 MongoDB 。 我选择这些技术是因为它们对于我的基于文档的问题是正确的技术。 如果我的数据与你的关系排序系统一样,我会在心跳中抛弃 Mongo 。

 
</rant>

 
作者:
...