我正在建立一个简单的会计系统,用户有很多账单.现在,我正试图决定账单应该是它自己的集合,还是嵌套在用户中.我倾向于前者,但我从来没有做过任何noSQL的东西,所以我只是通过try 和错误,以及我认为对我有意义的东西.

我知道Mongo有4mb的文档大小限制,这让我觉得我应该单独收集账单,因为这些账单每天都会累积,最终可能会占用大量空间.

我只是想听听大家对这件事的看法.基本上,我将在不同的日期段之间查询用户的账单(正如您可以想象的那样,会计系统会这样做).

这并不重要,但我正在Rails3项目中使用Mongoid.我想我会做一些类似的事情:

class User
  references_many :bills
end

class Bill
  referenced_in :user
end

如有任何意见或设计建议,我们将不胜感激.

推荐答案

1) 关于4MB文档限制,以下是《MongoDB:最终指南》中的内容:

大于4MB的文档(转换为BSON时)无法保存到数据库中.这是一个有点武断的限制(将来可能会提高);它主要是为了防止糟糕的模式设计并确保一致的性能.要查看文档doc的BSON大小(字节),请运行Object.B从shell 上取下尺寸(doc).

为了让你知道4MB是多少,War and Peace的整个文本只有3.14MB.

最终,这取决于你对用户账单增长的预期.我希望上面的摘录能让您了解文档大小所施加的限制.

2) 如果您知道永远不会对账单运行全局查询(例如,如果您想要检索输入到系统中的十张最新账单),则可以使用非规范化模式(账单随用户文档一起).如果使用非规范化模式,则必须使用map reduce来检索此类查询的结果.

如果希望灵活查询账单,那么规范化模式(用户和账单在单独的文档中)是更好的 Select .但是,由于MongoDB不支持连接,因此每次需要检索与用户对应的账单时,都必须运行多个查询.

考虑到您提到的用例,我将使用非规范化模式.

3) MongoDB中的所有更新都是原子的和序列化的.这应该能回答史蒂夫的担忧.

你可能会发现这些幻灯片很有帮助.http://www.slideshare.net/kbanker/mongodb-meetup

您还可以查看MongoDB的生产部署页面.你可以找到SF.net幻灯片非常有用.

Mongodb相关问答推荐

使用查询参数过滤MongoDB Go驱动程序时出现问题

映射数组值并查找每个匹配的集合

MongoDB更新对象数组

MongoDB(Mongoose)条件判断没有像我预期的那样工作

没有文档的MongoDB集合中的不一致,但当我执行count()时,它告诉我有15个文档

如何获取键值对的对象,其中值仅具有 mongoDB 中的投影字段

MongoDB - 来自先前匹配文档的聚合匹配字段

Golang 无法在 MongoDB 中创建文档

SELECT 字段 AS `anothername` 的 mongodb 等效项

如何构建我只需要打开一次 mongodb 连接的快速应用程序?

如何使用原子操作在一个文档中切换布尔字段?

Spring Mongo 条件查询两次相同的字段

如何在mongodb中删除数组的第n个元素

MongoDB GridFS VS 直接磁盘 IO

使用已排序的数据获取不同的值

Mongoose / MongoDB 用户通知方案建议

Mongodb错误:The positional operator did not find the match needed from the query

使用自定义 _id 值时 mongodb 中的 Upserts

带有索引字段的 MongoDB 正则表达式

在 NodeJs 中处理 Mongodb 全局连接的最佳方法是什么