我是mongodb和nosql数据库的新手。我真的很感激我的架构设计的一些输入/帮助,所以我不会在脚下拍摄自己。
数据:我需要对Quote
进行建模。 Quote
包含许多Ttem
个。每个Item
包含许多Order
个。每个Order
都与特定的财务季度挂钩。 实施例。我的Quote
包含Item
,其在Q3-14,Q4-14,Q1-15中有Order
秒。 Order
只有 max 未来12个季度(3年)。具体来说,我在建模Order
- 四分之一绑定时遇到了麻烦。我正在尝试对数据进行非规范化并嵌入Quote
< - Item
s< - Order
s以提高性能。
尝试/创意:
Order
和year
字段的qNum
架构。在Orders
每个Item
中嵌入一个qKey
数组。还可以创建虚拟Q1-14
字段,以便通过Order
Item
等密钥创建一个将Q1-14
嵌入Quote
的哈希值。这样会很好,但Mongoose本身不支持。 Item
中,并使每个Order
包含一个{{1}}的数组,但将它们与基数季度的#quarters偏移量进行索引。即如果它当前是Q1-14,并且Q4-14的订单进入,则将其存储在阵列位置2。我完全不在标记处吗?当我努力有效地使用Mongo时,任何建议都会受到赞赏。谢谢
答案 0 :(得分:5)
免责声明:我已经开始将此视为对自己的挑战。请参阅下面的
<rant>
,了解我不同意您的方法的原因。
牢牢掌握No-SQL的第一步是抛弃像“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({});
处理您的报价 - &gt;项目“关系”。要获得订单设置,您可以使用您已指示的嵌入式文档数组,但如果您决定开始查询/索引订单,那么您将在没有划桨的情况下上一条小溪。同样,我们可以通过引用来解决这个问题:
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
});
引用的问题在于,您实际上是在读取DB指令两次,一次找到父文档,然后一次填充其引用。
您可以在此处详细了解参考和人口:http://mongoosejs.com/docs/populate.html
<rant>
我可以继续几个小时,为什么你应该坚持使用RDBMS来获取这类数据。特别是当选择的辩护是缺乏ORM和Mongo“风靡一时”时。工程师为解决方案挑选最好的技术,而不是因为某种技术趋势。它是周末hackery和创建企业级产品之间的区别。不要误解我的意思,这不是垃圾No-SQL - 我维护的最大代码库是基于NodeJS和MongoDB构建的。但是,我选择这些技术是因为它们是我基于文档的问题的正确技术。如果我的数据是像你这样的关系排序系统,我会在心跳中抛弃Mongo。
</rant>