我应该如何在Meteor上的不同数据库集合中保存数据?

时间:2015-04-06 13:51:50

标签: mongodb meteor

我有一个Book页面提交,其中包含Book内容及其独特信息,但是authorsareas等一些数据保存在不同的集合中,并通过本书链接到数据库{ {1}}。我这样做,但我几乎可以肯定这不是最好的方法。

_id

问题在于,如果在Meteor.methods({ bookInsert: function(book, authors, areas) { // save unique book information var bookId = Books.insert(book); // save each author on a single row on Authors collection Object.keys(authors).forEach(function (singleAuthor) { var thisAuthor = { authorName: authors[singleAuthor], bookId: bookId } var authorId = Authors.insert(thisAuthor); }); //save each area on a single row on Areas collection Object.keys(areas).forEach(function (singleArea) { var thisArea = { areaName: areas[singleArea], bookId: bookId } var areaId = Areas.insert(thisArea); }); return { _id: bookId } } }) Insert上发生了一些错误,例如,书籍数据和作者数据已经保存在数据库中,就像在插入区域之前一样。

有没有更好的方法将所有这些数据保存在不同的集合中,这可以防止出现这种问题?或者这是在不同集合上保存多个数据的正确方法吗?

2 个答案:

答案 0 :(得分:1)

听起来你正在寻找类似MongoDB交易的东西。不幸的是,MongoDB没有明确支持事务,但是你仍然可以执行两阶段提交来实现类似事务的事务。

这里有一个关于两阶段提交的很好的教程:

http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/

答案 1 :(得分:1)

MongoDB没有[原子]事务,因为它们在NoSQL结构中实现起来非常昂贵。

这个话题非常清楚。如果你在mongo中搜索交易,你会发现一些关于如何实现最终一致性的好主意。例如:http://www.chess-ix.com/blog/transaction-in-mongodb-yes-we-can/

但是对于我的回答,我建议在NoSQL中研究模式设计。标准的ER建模仍然非常有用,但通常有利的是非标准化&嵌套文档(例如,将作者放入书籍集合中,或者将作者内部的书籍置于其中,具体取决于您的查询)对于流星开发者来说,这是一个很好的课程,下次会出现:https://university.mongodb.com/courses/M101JS/about