nodejs通知系统
我正在为我的网站做一个通知系统 。 像facebook
一样的通知系统。 或者是stackoverflow
。 我有2个问题。
-
如何存储在分贝? 我可以将所有通知存储在用户文档中? 或在一个文件分开(因为我认为monogdb是有限的文件大小?)或者,智能存储? (在数据库中使用inc或值(请参见:true / false),查询复杂)
-
如何在页面上带? 例如,当我点击我的
inbox
中的链接为stackoverflow
,我redirect到页面。 但是,我有一个以multipage
为例的系统:我有100个朋友。 每页列出30个。 所以当我点击通知我不能redirect到,因为它是不可能知道的好页面(用户可以被删除)。
非常感谢你 ! 如果你有其他想法,告诉我。 谢谢。
编辑:
(抱歉我的英文,我是法语)
对于第一个问题,我意识到我必须等待时间来select我的结构。 因为我的通知是有点复杂的,所以提前的感觉。
第二,我解决了这个问题。 我解释一下:(我以朋友为例,因为它很容易被忽略)。我存储了我的数据,如下所示:
{ friends: [ {_id: xxxxx, ts: xxxx}, {_id: xxxxx, ts: xxxx} ] }
想象一下,我显示所有的朋友:每页30。 问题是:
- 当我想显示所有的朋友,我不能使用mongosorting。 (有点问题)
- 如果我想引导用户到这个列表(每页30个)在一个特殊的朋友,总是保持
sort
ts
。 我无法知道页面。 uniq解决scheme是采取所有文件。 但是:performance非常糟糕。
所以,我这样储存:
{ friends: { xxxx: {ts:xxx}, xxxx: {ts:xxx} } }
知道我可以使用跳过和限制来sorting文档。 所以,如果我想要一个部分,我不需要采取所有的文件。
要知道这个页面,我只是给ts写一个<或>的数字,例如11个朋友是我想要的朋友,并且为所有的朋友(例如:50个朋友)计数,与50和11,我可以猜测页面。
这个解决scheme好吗? – 我需要一个计数 – 一个查询知道>或<的数量,我可以把页面列出的朋友,保持the sort ts
你可以不明白我为什么使用计数。 我需要,因为他们不存储在同一个文件。
2编辑:
这个解决scheme的问题是,我需要在mongo query
之外创buildquery object
和update object
(例如:do friends.xxxxxx: {$exists:true}
ps:有什么好处是用ts
代替MongoDB的date
? 我使用ts
但我想我会存储date
,没有ts
。
3编辑
我会像Sammaye
那样Sammaye
。 保存在单独的文件中。 看看: http : //mongly.com/Multiple-Collections-Versus-Embedded-Documents/#1和http://openmymind.net/2012/1/30/MongoDB-Embedded-Documents-vs-Multiple-collections/
@Stennie做出了一个相当完整的答案。
不过最近我在我的网站上做了类似的事情。 首先要了解的是,你是在做一个通知系统还是一堵墙(这两者是截然不同的),我似乎还不清楚,我不确定你的意思是:
如何在页面上带? 例如,当我点击我的收件箱中的链接为stackoverflow,我redirect到页面。 但是,我有一个以多页面为例的系统:我有100个朋友。 每页列出30个。 所以当我点击通知我不能redirect到,因为它是不可能知道的好页面(用户可以被删除)。
这不是很好的英文,阅读时很混乱。 如果你可以扩展,我相信人们可以更好地回答。
对于通知系统,我发现大量的通知对象也起作用。 所以我有一个模式,如:
{ _id: {}, to_user: ObjectId{}, user_id: ObjectId{}, // Originating user custom_text: "has posted a new comment on your wall post", read: false, ts: MongoDate() }
这实际上是我必须提供通知的文件。 每次用户提交产生通知的操作时,都会向数据库写入一个新行,并且每次都需要通知每个用户to_user
填充to_user
。 至于多个用户提交相同的行动,我实际上转换的OjbectId
列表中的user_id
字段,所以我可以说:
Sam, Dan and Mike all commented on your wall post
然后我通过ts
查询存储用户在他们的行中查看的最后一个ts
,从而允许我每次都对最新的通知执行基于范围的查询。 这对我个人经验的分解和查询非常有效。
希望能帮助到你,
embedded或链接是MongoDB中数据build模的常见问题。 如果你的通知数量是无限的,你可能会更好地把它们保存在一个单独的集合中。
目前的16Mb文件限制实际上并不像其他一些问题那么严重:
-
将所有通知包含在单个文档中可能会遇到的性能问题是快速增长的文档可能需要更频繁地重新定位到数据库中(请参阅填充因子 )。
-
您可能希望在很短的时间内对文档应用多个更新(例如在通知上设置“读取”标志),这意味着更多争用更新同一文档(请参见“ primefaces操作” )。
为了实现分页,可以将limit()与范围查询或skip()结合使用。 范围查询(例如,基于索引的notificationDate
)将会更有效地使用索引,并且随着收集的增长,执行比skip()
更好的操作。