我正在用 node.js 和 mongoose 开发一个聊天系统。用mongodb把整个聊天记录存进去好不好?还是我们应该使用 ant 替代品?
最佳答案
好的,所以我已经使用评论内容稍微转换了这个问题:
But few of my friends suggested that its better not to use mongoDB collection that grows. Thats why am little bit confused. What would you do if you were doing this project??
关于如何有效使用 MongoDB 的建议。
我不确定你的 friend 引用了什么引用资料,但 MongoDB 非常擅长像应用程序一样聊天,其初始数据永远不会更新,也就是你永远不会向服务器发送更新语句,只有 insert() 和一个 remove()(可能是一个更新,说明何时看到它,但这应该是一个就地更新)。
如果您正在更新行(文档),MongoDB 就不会那么好,但是,在最近的版本中,MongoDB 也变得更好了。默认情况下引入 powerof2sizes 意味着在文档需要移动到新磁盘扇区之前,您实际上可以将消息增长到接近其原始大小的 2 的幂,从而使磁盘重用也更容易.当然,非就地更新对 IO 和 CPU 来说都是昂贵的。
至于搜索,SQL 确实拥有 FTS,但是,正如 Stack Exchange 自己发现的那样:数据库在搜索方面并不擅长。他们很快用 Elastic Search 取代了 MS SQL FTS。
至于排序:我不确定为什么 SQL 在这里会更好。 MongoDB 可以对索引进行排序,在这种情况下,对非索引进行排序在任何数据库中都是非常糟糕的做法。想象一下,必须从数据库中加载每条评论才能进行排序。所以在排序时两者是相等的。
有了分组,MongoDB 现在有了聚合框架,但由于回归,目前缺乏使用覆盖查询的能力。这意味着一个组当前将从磁盘加载,而不是仅使用索引。这确实使 SQL 在这方面做得更好……目前。然而,我很难看到你会如何分组,你会有两个表:
一个屏幕显示第一个表格,第二个表格显示...第二个。
您将在第一个表上按 user_id 过滤,在第二个表上按 convo_id 过滤。
日志是聊天应用程序中非常普遍要求的功能,因此与@Rax 不同,我不会在我的理由中使用它;除了 MongoDB 和其他技术之间的空间要求外,我不确定这会如何改变任何事情。话虽这么说:相当多的技术实际上默认使用 MVCC,这将比 MongoDB 占用更多的空间(值得一提的是,SQL 技术人员不这样做,但很多数据库,如聊天公司使用的 CouchDB 等) .
我还想说你会读的比你写的多。每次有人发消息都会有人读,而不只是在原来的一面说“已发送!!!”而且在接收端说“获取下一条消息”。所以每条消息都会触发双倍的阅读。 MongoDB 针对这些类型的工作流进行了优化。
无论如何,这应该会给你一些指导。我会试用 MongoDB 并了解它如何为您工作。
关于node.js - mongodb + nodejs 保存聊天记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27224668/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr