2014-01-19 65 views
1

在这里我的问题:我想创建一个网络,允许用户上传帖子和喜欢他们。喜欢在mongoDB

我想我可以将每篇文章存储在一个名为'post'的集合中,而且我没有这样做的问题。

但我在哪里可以存储每个帖子上的相关数据(时间,用户等等)喜欢? 我不能在发布文档里面这样做,因为文档的最大尺寸是16MB,并且想象我将不得不为每个帖子记录数千个喜欢的相关数据,我无法做到这一点。

我可以将每个帖子关联到一个集合,其中包括文档和每个文档是一样的。但是,如果可能的话,我真的不想创造数百万和数百万的收藏。后文件的

例子:

{_id: blabla, userfrom: {}, txt: "i am the post", time: {}, geo: {}, likes: {here i have to add as many likes as users clicks, and it can exceed 16MB}}

现在

在“喜欢”我可以把一个引用的集合,但是这是我想不能做什么。

我读过关于MongoDB的gridstore,但我没有明白。我可以使用它作为一个大小可以趋于无限的文件吗?所以我可以添加尽可能多的记录,因为我想要?因此,与电网商店,我可以这样做:

{_id: blabla, userfrom: {}, txt: "i am the post", time: {}, geo: {}, likes: {infinite records}}

有人可以帮助我处理吗?谢谢

+0

不确定你的意思是“创造数百万和数百万的收藏”。常见的做法是创建一个集合,每个集合包含一个文档,其中包含对其所引用的帖子的引用。为什么这不起作用? –

+0

为什么不把喜欢的文件存储为文件?每个人都有他们喜欢的职位的参考ID?并且,保留帖子中的总数,以便代码实际上不需要每次都得到一个计数。我敢打赌,每次显示帖子时都不需要获取每个“喜欢”的详细信息,因此最好不要将所有数据存储在一个文档中。 – WiredPrairie

+0

你的意思是为每个帖子或单个集合创建一个集合,将所有帖子中的所有喜欢集合在一起? @AndreasHultgren – Morrisda

回答

3

当你不想嵌入喜欢,你必须去关系的方式。

创建另一个集合“喜欢”,其中每个文档都有一个字段,表示它适用于哪个帖子。为了避免必须计算likes-collection中的所有条目来获取帖子的喜欢数量,还应该将当前计数存储在后文档中。

关于GridFS:我认为它不会帮助你。它不应该用于文档。其目的是将大型二进制文件存储在数据库中。

+0

如果我们将当前计数存储在后期文档中,则每次用户喜欢或不喜欢该文章时,都需要更新该计数。不要认为数百万次更新文档是最好的想法,因为数据在发布和类似表格之间不会保持一致。 –

+1

@JyotmanSingh在你的应用程序中会发生什么更频繁的事情:用户*看到*喜欢数字或用户*改变*喜欢数字?更频繁的情况是你应该优化的。我非常肯定,这个数字将会被更多地读取,而不是被写入。我也非常肯定,拥有*百万*喜欢的文档与标准相比是个例外,大多数文档的数量会少得多,但拥有数百万喜欢的文档仍然是那些意见最多的文档。但它是你的应用程序。 – Philipp

+0

是的,你提出了一个非常有效的观点。我不会进一步评论,因为我不知道更好的解决方案,但是知道这是否有更好的解决方案会很好。这似乎是很常见的问题(喜欢),但我还没有遇到一个非常好的实现。 –