我有一个关系SQL DB,它被改为MongoDB。在SQL中有3个相关的表:Farm,Division,Wombat(此问题的名称和用途已更改)。还有一个Farmer表,它相当于一个用户表。
使用Mongoose我已经提出了这个新架构:
var mongoose = require('mongoose');
var farmSchema = new mongoose.Schema({
// reference to the farmer collection's _id key
farmerId: mongoose.Schema.ObjectId,
name: String, // name of farm
division: [{
divisionId: mongoose.Schema.ObjectId,
name: String,
wombats: [{
wombatId: mongoose.Schema.ObjectId,
name: String,
weight: Number
}]
}]
});
每个(现在)嵌套的集合中都有一个唯一的字段。这将允许我使用Ajax仅发送uniqueId和权重(例如)来调整该值,而不是仅在权重发生变化时更新整个文档。
这感觉就像MongoDB的SQL改编不正确。有更好的方法吗?
答案 0 :(得分:2)
总的来说,我认为人们在使用MongoDB时往往会过多地嵌入。
最重要的论点是,对同一个对象使用不同的编写器会使事情变得复杂得多。使用数组和嵌入对象可能很棘手,有些修改是不可能的,例如因为没有positional operator matching in nested arrays。
对于您的特定情况,请注意唯一的数组键might not behave as expected,并且该行为可能为change in future releases。
通常需要选择简单的类似SQL的架构,例如
Farm {
_id : ObjectId("...")
}
Division {
_id : ObjectId("..."),
FarmId : ObjectId("..."),
...
}
Wombat {
_id : ObjectId("..."),
DivisionId : ObjectId("..."),
...
}
嵌入是否是正确的方法取决于使用模式,数据大小,并发写入等等 - SQL的一个关键区别是there is no one right way to model 1:n or n:n relationships,因此您必须仔细权衡专业人员每种情况的利弊。根据我的经验,拥有唯一的ID是一个非常有力的指标,表明该文档应该是“一等公民”并拥有自己的集合。