Javascript 我的模型应该有多细粒度?
使用meteor的数据模型应该有多细粒度 e、 g 假设我有一个Javascript 我的模型应该有多细粒度?,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,使用meteor的数据模型应该有多细粒度 e、 g 假设我有一个XmlDocument模型,它包含几个XmlNodes 我应该仅仅创建一个新的Meteor.Collection(“文档”)并在整个文档的基础上进行更新吗 Documents = new Meteor.Collection("documents"); Documents.insert(new XmlDocument()); var doc = Documents.findOne().fetch(); doc.nodes.pus
XmlDocument
模型,它包含几个XmlNodes
我应该仅仅创建一个新的Meteor.Collection(“文档”)并在整个文档的基础上进行更新吗
Documents = new Meteor.Collection("documents");
Documents.insert(new XmlDocument());
var doc = Documents.findOne().fetch();
doc.nodes.push(new XmlNode());
Documents.update(doc);
或者,我应该将节点拆分为一个单独的集合,其中每个项都有一个指向其所属文档的id(即.NET Entity Framework的id)
我很难弄清楚这一点,因为我不确定Meteor实现的粒度有多细,也就是说,在执行
更新时,它是否与当前版本有差异,并且只对服务器执行最少的工作,或者它只是将整个数据作为单个事务发送?不是每次都重新创建整个文档,而是使用addToSet并拉入文档中的数组
var _newDocId = Documents.insert(new XmlDocument());
var _newNode = new XmlNode();
Documents.update({_id: _newDocId}, {$addToSet: {nodes: _newNode}});
在数组中更新文档有点棘手,所以您可能希望确保这是您想要做的,而不是使用单独的集合,但是,您可以执行以下操作
var _document = Documents.findOne({_id: _documentContainingNode});
var _nodeToUpdateIndex = _.indexOf(_.pluck(_document.nodes, '_id'), _nodeId);
var _modifier = {$set: {}};
_modifier.$set["nodes." + _nodeToUpdateIndex + ".description"] = "new description";
Documents.update({_id: _document._id}, _modifier);
更新数组中的对象是拥有大型嵌套对象的缺点。
将它们分开的缺点是,您必须确保将它们一起发布。。很明显,你失去了操作的原子性。如果要同时对节点和文档进行更新。
这更多的是你的决定,而不是流星“实施”
或者它只是将整个数据作为单个事务发送
不幸的是,任何文档更改都会将整个文档发送给客户。因此,我认为,以这种方式构建数据库结构是不明智的——这意味着一个集合中有一个大文档(而不是几个集合)。如果您安装并启用DDP,则可以查看DDP如何工作以及它将向您发送什么