Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将消息传递模式移动到MongoDB_Mongodb_Schema_Messaging - Fatal编程技术网

将消息传递模式移动到MongoDB

将消息传递模式移动到MongoDB,mongodb,schema,messaging,Mongodb,Schema,Messaging,我使用此模式支持站点内消息传递: 当我向其他成员发送消息时,消息将保存到消息表中;记录被添加到MessageSent表中,每个收件人的记录被添加到MessageInbox表中。MessageCount用于跟踪inbox/send文件夹中的邮件数量,并使用MessageInbox/MessageSent上的插入/删除触发器填充—这样,我就可以随时知道成员有多少封邮件,而无需进行昂贵的“select count(*)查询 另外,当我查询成员的消息时,我加入到成员表中以获取成员的名字/姓氏 现在,我

我使用此模式支持站点内消息传递:

当我向其他成员发送消息时,消息将保存到消息表中;记录被添加到MessageSent表中,每个收件人的记录被添加到MessageInbox表中。MessageCount用于跟踪inbox/send文件夹中的邮件数量,并使用MessageInbox/MessageSent上的插入/删除触发器填充—这样,我就可以随时知道成员有多少封邮件,而无需进行昂贵的“select count(*)查询

另外,当我查询成员的消息时,我加入到成员表中以获取成员的名字/姓氏

现在,我将把应用程序移到MongoDB,我不太确定集合模式应该是什么。因为MongoDB中没有可用的连接,所以我必须对其进行完全的非规范化,所以我会使用MessageInbox、MessageDraft和MessageSent集合来提供完整的消息信息,对吗

那么我不确定以下几点:

  • 如果用户更改了他的名字/姓氏怎么办?它将作为发送方存储在某些邮件中,作为收件人的一部分存储在其他邮件中-如何以最佳方式更新它

  • 如何获取邮件计数?同时会有大量的请求,因此它必须表现良好


  • 非常感谢您的任何想法、意见和建议

    关于我在MongoDB中模拟连接所做的工作,我可以为您提供一些见解

    在这种情况下,我将相应用户(或多个用户)的ID存储在给定对象中,例如messages集合中的message对象

    (我不是建议这是你的模式,只是用它作为我方法的一个例子)

    我将查询数据库以获取我需要的所有消息,然后在我的应用程序中迭代结果并构建一个用户ID数组。我会过滤这个数组使其唯一,然后使用
    $in
    操作符再次查询数据库,以查找给定数组中的任何用户

    然后在我的应用程序中,我将把结果连接回对象

    它需要对数据库进行两次查询(如果您想加入其他集合,可能需要进行更多查询),但这说明了许多人长期以来一直提倡的一点:在应用程序层中进行连接。让数据库花时间查询数据,而不是处理数据。无论如何,您可以比数据库更快、更便宜地扩展应用程序服务器

    我正在使用这种模式在我的应用程序中创建实时活动提要,它可以完美快速地工作。我更喜欢这样做,而不是去规范化可能会改变的东西,比如用户信息,因为在写入数据库时,如果新数据不适合旧数据,MongoDB可能需要重新写入整个对象。如果我需要重写数据库中数百(或数千)个活动项,那么这将是一场灾难

    此外,MongoDB上的写操作是阻塞的,因此如果发生我刚才描述的场景,所有读写操作都将被阻塞,直到写操作完成。我相信这将在2.x系列中以一定的容量得到解决,但它仍然不是完美的


    另一方面,索引查询速度非常快,即使您需要执行其中两项来获取数据。

    我可以为您提供一些关于我在MongoDB中模拟联接所做工作的见解

    在这种情况下,我将相应用户(或多个用户)的ID存储在给定对象中,例如messages集合中的message对象

    (我不是建议这是你的模式,只是用它作为我方法的一个例子)

    我将查询数据库以获取我需要的所有消息,然后在我的应用程序中迭代结果并构建一个用户ID数组。我会过滤这个数组使其唯一,然后使用
    $in
    操作符再次查询数据库,以查找给定数组中的任何用户

    然后在我的应用程序中,我将把结果连接回对象

    它需要对数据库进行两次查询(如果您想加入其他集合,可能需要进行更多查询),但这说明了许多人长期以来一直提倡的一点:在应用程序层中进行连接。让数据库花时间查询数据,而不是处理数据。无论如何,您可以比数据库更快、更便宜地扩展应用程序服务器

    我正在使用这种模式在我的应用程序中创建实时活动提要,它可以完美快速地工作。我更喜欢这样做,而不是去规范化可能会改变的东西,比如用户信息,因为在写入数据库时,如果新数据不适合旧数据,MongoDB可能需要重新写入整个对象。如果我需要重写数据库中数百(或数千)个活动项,那么这将是一场灾难

    此外,MongoDB上的写操作是阻塞的,因此如果发生我刚才描述的场景,所有读写操作都将被阻塞,直到写操作完成。我相信这将在2.x系列中以一定的容量得到解决,但它仍然不是完美的


    另一方面,索引查询速度非常快,即使您需要执行其中两项来获取数据。

    这是个好主意。有没有想过以一种有效的方式收集消息计数?最好的方法可能是将预先计算的计数存储在某个地方。MongoDB 2.x计划增加一些聚合操作符,比如$sum,但目前还没有。对于类似的事情,您可能只想将其存储在某个地方,并在发送消息时使用$inc操作符增加它。这是一个好主意。有没有想过以一种有效的方式收集消息计数?最好的方法可能是将预先计算的计数存储在某个地方。MongoDB 2.x计划有额外的聚合操作符,比如$sum,但是
    {
        _id: "msg1234",
        from: "user1234",
        to: "user5678",
        subject: "This is the subject",
        body: "This is the body"
    }