我有一个Book页面提交,其中包含Book内容及其独特信息,但是authors
和areas
等一些数据保存在不同的集合中,并通过本书链接到数据库{ {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上发生了一些错误,例如,书籍数据和作者数据已经保存在数据库中,就像在插入区域之前一样。
有没有更好的方法将所有这些数据保存在不同的集合中,这可以防止出现这种问题?或者这是在不同集合上保存多个数据的正确方法吗?
答案 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