我的模型应该有多细粒度?

时间:2014-07-17 14:10:00

标签: javascript mongodb meteor

使用meteor的数据模型应该有多细粒度?

e.g。

假设我有XmlDocument模型,其中包含多个XmlNodes

我应该只是创建一个new Meteor.Collection("Documents")并在整个文档的基础上进行更新,例如

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一样)?

我有点困难,因为我不确定Meteor实现的细微程度,即在执行update时它是否使用当前版本执行差异并仅执行最小化对服务器的工作量,还是仅将整个数据作为单个事务发送?

2 个答案:

答案 0 :(得分:1)

不是每次都重新创建整个文档,而是使用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);

更新数组内的对象是拥有大型嵌套对象的缺点。 将它们分开的缺点是你必须确保将它们一起发布。显然,你失去了操作的原子性。如果要同时更新节点和文档。 这比Meteor“实施”更多是你的决定

答案 1 :(得分:0)

  

或者它只是将整个数据作为单个交易发送?

不幸的是,在任何文件更改时,它会将整个文档发送到客户端。所以我认为,用这种方式构建数据库结构并不明智 - 在一个集合中代表一个大文档(而不是几个集合)。 DDP如何工作以及发送给您的内容可以看到您是否安装并启用Meteor DDP Analyzer