nodejs通知系统

时间:2012-08-06 23:31:32

标签: node.js mongodb

我正在为我的网站做一个通知系统。 像facebook这样的通知系统。或stackoverflow。 我有 2 问题。

  1. 如何在db中存储?我可以在用户文档中存储所有通知吗?或者在文档中(因为我认为monogdb在文档中的大小有限?)或者,智能存储? (在db中使用inc或值(参见:true / false),查询复杂)

  2. 如何引入页面?例如,当我点击inbox stackoverflow中的链接时,我会重定向到该页面。但是我,我的系统multipage例如:我有100个朋友。每页列出30个。因此,当我点击通知时,我无法重定向到该通知,因为无法知道好的页面(用户可以被删除)。

  3. 非常感谢! 如果你有其他想法,请告诉我。感谢。

    修改

    (对不起我的英语,我是法国人)

    对于第一个问题,我意识到我必须等待时间来选择我的结构。因为我的通知是......有点复杂,所以提前感觉。

    第二,我解决了这个问题。我解释: (我以朋友为例,因为很容易找不到。) 我存储了这样的数据:

    {
      friends: [
        {_id: xxxxx, ts: xxxx},
        {_id: xxxxx, ts: xxxx}
      ]
    }
    

    想象一下,我显示所有朋友:每页30个。 问题是:

    • 当我想显示所有我无法使用mongo排序的朋友时。 (有点问题)
    • 如果我想引导用户访问此列表(每页30个),请始终将sort保持为ts。我不知道这个页面。 uniq解决方案是采取所有文件。 但是:表现非常糟糕。

    所以,我这样存储:

    {
      friends: {
        xxxx: {ts:xxx},
        xxxx: {ts:xxx}
      }
    }
    

    知道我可以使用skip和limit对文档进行排序。 所以,如果我想要一份,我不需要拿走所有文件。

    要知道该页面,我只需要<或者>对于ts​​,我有11个朋友,例如>对于我想要的朋友来说,用50和11对所有朋友(例如:50个朋友)进行统计,我可以猜到这个页面。

    这个解决方案好吗? - 我需要一个计数 - 查询以了解>的数量或者< 我可以把朋友列在哪里的页面,保持the sort ts

    你可能不明白我为什么要使用计数。我需要因为他们没有存放在同一个文件中。

    2编辑:

    此解决方案的问题在于,我需要在query object之外设置update objectmongo query(例如:for friends.xxxxxx: {$exists:true}

    ps:对于mongodb,使用ts代替date有什么好处? 我正在使用ts,但我想我会存储date,而不是ts

    3编辑

    我会像Sammaye那样。存储在单独的文档中。请查看:http://mongly.com/Multiple-Collections-Versus-Embedded-Documents/#1http://openmymind.net/2012/1/30/MongoDB-Embedded-Documents-vs-Multiple-Collections/

2 个答案:

答案 0 :(得分:3)

@Stennie做了一个非常完整的答案。

但是最近我在PHP上为我的网站做了类似的事情。首先要明白的是你是在做一个通知系统还是一个墙(两者是非常不同的),我似乎不清楚,我不确定你的意思:

  

如何为页面带来?例如,当我点击链接时   在我的stackoverflow的收件箱中,我重定向到页面。但我,我   有一个多重系统例如:我有100个朋友。那里   每页列出30个。所以,当我点击通知我不能   重定向到因为它不可能知道好的页面(用户   可以删除)。

这不是很好的英语,当我阅读它时非常混乱。如果你可以扩展,我相信人们可以更好地回答。

对于通知系统,我发现大量通知对象也有效。所以我有一个类似的架构:

{
    _id: {},
    to_user: ObjectId{},
    user_id: ObjectId{}, // Originating user
    custom_text: "has posted a new comment on your wall post",
    read: false,
    ts: MongoDate()
}

这就是我必须生成通知的文件。每次用户提交生成通知的操作时,它都会向DB写入一个新行,每次填充to_user时,每个用户都需要通知。对于提交相同操作的多个用户,我实际上会转换user_id列表中的OjbectId字段,因此我可以说:

Sam, Dan and Mike all commented on your wall post

然后我通过ts查询存储用户在其行中查看的最后ts,允许我每次都对最新的通知进行基于范围的查询。这非常适合我个人经历中的分片和查询。

希望它有所帮助,

答案 1 :(得分:1)

是否embed or link是MongoDB中数据建模的常见问题。如果您的通知数量无限制,您可能会更好地将这些通知保存在单独的集合中。

目前的16Mb文档限制实际上并不像其他一些考虑因素那样多:

  • 通过在单个文档中包含所有通知可能会遇到的性能问题是,快速增长的文档可能还需要更频繁地重新定位到数据库中(请参阅Padding Factor)。

  • 您可能希望在很短的时间内对文档应用多个更新(例如在通知上设置“读取”标志),这意味着更多争用更新同一文档(请参阅{{ 3}})。

为了实现分页,您可以将Atomic Operations与范围查询或limit()结合使用。范围查询(例如,基于索引notificationDate)将更有效地使用索引,并且随着集合的增长,性能优于skip()