我被困在这两个NoSQL数据库之间。
在我的项目中,我将在数据库中创建一个数据库。 例如,我需要一个创建动态表的解决方案。
因此用户可以创建包含列和行的表。 我认为MongoDB或CouchDB对此都有好处,但我不确定是哪一个。 我也需要高效的分页。
-
我希望他们能够修改系统,以便更好地促进他们正在寻找的主题问题的创建,并更好地引导用户解决这个问题。我不知道这个问题是否得到解决,也没有方便的方法来追踪它。
-
我希望他们能够在这个网站中添加功能,我们可以"赞成"或"低估"将这个问题作为"偏离主题"的原因,这可能有助于将这些类型的问题转回"关于主题"。
-
++我不清楚为什么这是偏离主题的。这个问题确实有明确的客观答案 - OP不是要求意见,而是要求有关这两个系统的客观信息。 user799188提供了很好的客观答案。
-
我想管理员只是看看问题,如果它包含任何代码而不是所寻求的信息。顺便说一句,你总是可以投票重新打开这个问题。
-
这个问题刚刚重新开放。欢迎回来,大家......
-
couchdb更像是一个数据库:它允许使用javascript(或其他语言)创建服务器端Web应用程序。它还为您管理Web缓存(使用etags)。我不知道mongodb。
-
我很惊讶没有人提到CouchDB changes_ feed。我发现这非常有用,特别是当你打开keep-alive或longpoll连接时。有关详细信息,请访问docs.couchdb.org/en/2.1.1/api/database/changes.html
C,A& P(一致性,可用性和分区容差)哪个2对您更重要?快速参考,NoSQL系统的可视化指南
-
MongodB:一致性和分区容差
-
CouchDB:可用性和分区容差
一篇博客文章,Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Membase vs Neo4j比较每个NoSQL数据库的"最佳使用"场景比较。引用链接,
-
MongoDB:如果需要动态查询。如果您更喜欢定义索引,而不是map / reduce函数。如果你需要在大数据库上有良好的性能。如果你想要CouchDB,但你的数据变化太大,填满了磁盘。
-
CouchDB:用于累积,偶尔更改数据,以运行预定义的查询。版本控制很重要的地方。
Riyad Kalla最近(2012年2月)和更全面的比较,
-
MongoDB:仅主从复制
-
CouchDB:主 - 主复制
一篇博客文章(2011年10月)是一位尝试过这两篇文章的人,A MongoDB Guy Learns CouchDB对CouchDB的分页发表评论并不是很有用。
Kristina Chodorow(MongoDB背后的团队成员)的日期(2009年6月)基准测试,
我会去MongoDB。
希望能帮助到你。
-
根据我的理解,MongoDB在任何方面都不一致:ivoras.sharanet.org/blog/tree/…
-
当时的好信息,但这真的很旧......很多都改变了(包括Mongo的REST接口)。
-
这里有一些进一步的比较和代码示例:scottlogic.com/blog/2014/08/04/mongodb-vs-couchdb.html
-
MongoDB似乎有更高的分布,如果你相信谷歌的趋势:google.at/trends/explore#q=MongoDB%2C%20couchdb
-
我认为这可能有点误导,但在couchdb中进行版本控制并不是一个争论。 couchdb使用的版本控制方案不应该用作每个版本的版本。它用于处理分区。在数据库压缩期间,修订将被删除,就像真正删除一样。只有rev链应保留在数据库中。如果你想在couchdb中处理版本,它应该像在mongodb中一样完成。
-
我将列表添加到couchdb可以拥有自包含的Web应用程序。就像在couchdb中实际上是一个网络服务器。
-
我很惊讶332票的错误答案。 MongoDB默认为CP,CouchDB为AP stackoverflow.com/questions/11292215/…
-
当MongoDB是CP时,CouchDB是AP或BASE(最终一致且高度可用)。无论如何,我不明白为什么回答这些问题,人们在许多其他方面和特征之前对CAP定理如此重视。例如,查询CouchDB的限制可能会更大,但要记住。
-
自最初的回复以来,社区进行了编辑,确实说MongodB是CP而CouchDB是AP
-
Mongo => CP,Couch => AP,根据无sql可视化图表。我很困惑哪一个是正确的。
-
@ Loï cFaure-Lacroix作为一个严肃的CouchDB用户,绝对没有理由不使用db的版本来实现你自己的版本。
-
@OrangeDog有...以前的版本将被清除出数据库。它们唯一的用途是检测文档冲突。压缩之后,所有先前的修订都将被删除,并且唯一保留在数据库中的是修订树。如果要向文档添加版本,您希望它们能够在压缩后继续存在,并且只有在您选择删除它们时才会被删除。
-
@ Loï cFaure-Lacroix你是对的,除了版本并不意味着你必须关心除最新版本以外的任何东西。即使你这样做也没有理由你不能使用db的版本字段,同时在最新版本中保留以前版本的副本(或差异)。
-
@OrangeDog如果您在最新版本中保留副本,那么您就可以有效地进行自己的修订管理。此外,将副本保留在同一对象内将使其超时。如果通常更改对象...更好地创建一个新对象,因为在最坏的情况下,每个新插入都需要拉/插入所有以前的修订。
-
@OrangeDog CouchDB中的版本控制解决方案应该更像Git,它存储所有修订版本,但是有一种方法可以让用户告诉何时丢弃不再有用的旧版本。 Loï c Faure-Lacroix是对的。
-
对于现代CouchDB,这个答案大多不准确。 CouchDB现在具有动态查询,几乎与MongoDB完全相同。它的复制模型也有很大改进。
上面的答案使故事复杂化。
如果您计划拥有移动组件,或者需要桌面用户脱机工作,然后将其工作同步到服务器,则需要使用CouchDB。
如果您的代码只在服务器上运行,那么请使用MongoDB
而已。除非您需要CouchDB(非常棒)复制到移动和桌面设备的能力,否则MongoDB目前具有性能,社区和工具优势。
-
简洁,我喜欢它。
-
我喜欢这样简单的非过度技术性答案。谢谢!
-
这个答案适用于那些正在寻找移动,离线和同步的人!谢谢
-
当我读到"复制到移动设备"时我笑了吗?哈哈你的数据有多少?
-
"哈哈,你的数据有多少?" - 那是真的吗?我可能选择CDB,因为我的数据很大 - 或者我可能会选择它,因为它比其他选择具有更好的复制。在这种情况下,我们将每个设备的数据集过滤到大约100Mb-200Mb。那是一件坏事?
-
如果您的代码只能在一台服务器上运行。使用多主复制可以轻松排序高可用性系统。
-
@EwanMakepeace这是Consistency Vs Availability的最佳解释!
很老的问题,但它在谷歌的顶部,我不太喜欢我看到的答案,所以这是我自己的。
Couchdb的功能远远超过开发CouchApps的能力。大多数人在经典的3层Web架构中使用CouchDb。
在实践中,大多数人的决定因素是MongoDb允许使用类似SQL的语法进行临时查询,而CouchDb则没有(你必须创建map / reduce视图,即使创建这些视图也会让某些人失望是快速应用程序开发友好 - 它们与存储过程无关)。
为了解决在接受的答案中提出的问题:CouchDb有一个很好的版本控制系统,但这并不意味着它只适用于(或更适合)版本化很重要的地方。此外,由于其仅附加性质,couchdb具有重写友好性(写入操作立即返回,同时保证不会丢失任何数据)。
任何人都没有提到的一件非常重要的事情是CouchDb依赖于b树索引。这意味着无论您有1个"行"还是20亿个,查询时间将始终保持在10毫秒以下。这是一个改变游戏规则的游戏,它使CouchDb成为一个低延迟且易读的数据库,这真的不容忽视。
为了公平和详尽,MongoDb优于CouchDb的优势在于工具和营销。他们拥有适用于所有主要语言和平台的一流公民工具,使得入职变得轻松,这增加了他们的特殊查询,使得从SQL过渡变得更加容易。
CouchDb没有这种级别的工具 - 即使现在有很多库可用 - 但CouchDb作为HTTP API公开,因此很容易用你最喜欢的语言创建一个包装器来与之交谈。我个人喜欢这种方法,因为它避免膨胀,并允许你只采取你想要的(界面隔离原则)。
因此,我认为使用其中一个很大程度上是对他们范式的安慰和偏好的问题。对于某些人来说,CouchDb方法"恰到好处",但如果在了解了数据库功能(在详尽的官方指南中)之后,你没有"地狱耶"的那一刻,那么你应该继续前进。
如果您只是想使用"正确工具的正确工具",我会劝阻使用CouchDb。因为你会发现你不能以那种方式使用它,你最终会生气并写博客帖子,例如"CouchDb中的哪些联接?"和"交易管理在哪里?"。事实上,Couchdb是 - 自相矛盾 - 非常透明,但同时需要一种范式转换,以及改变你处理问题的方式来真正发挥(并真正起作用)。
但是一旦你做完了,它真的会有回报。我个人需要非常强大的理由或在项目上选择另一个数据库的重大交易,但到目前为止我还没有遇到任何数据库。
-
2016年更新:自2016年9月发布2.0版以来,CouchDb支持开箱即用的即席查询:)
-
docs.couchdb.org/en/2.0.0/query-server也是如此吗?
-
CouchDb relies on b-tree indexes. This means that whether you have 1"row" or 20 billions, the querying time will always remain below 10ms.几乎所有数据库都不是这样吗?这种措辞暗示了其他方式。
自己问这个问题?您将决定您的数据库选择。
你需要高手吗?然后是CouchDB。主要是CouchDB支持主 - 主复制,预计节点会长时间断开连接。 MongoDB在这种环境下表现不佳。
您需要MAXIMUM R / W吞吐量吗?然后是MongoDB
您是否需要最终的单服务器持久性,因为您只需要一台数据库服务器?然后是CouchDB。
您是否在保持疯狂吞吐量的同时存储需要分片的MASSIVE数据集?然后是MongoDB。
您需要强大的数据一致性吗?然后是MongoDB。
您需要高可用性的数据库吗?然后是CouchDB。
您希望多数据库和多表/集合吗?然后是MongoDB
您有移动应用离线用户,并希望将其活动数据同步到服务器?然后你需要CouchDB。
你需要各种各样的查询引擎吗?然后是MongoDB
你需要大型社区来使用数据库吗?然后是MongoDB
-
从CouchDB 2.x开始,#9是CouchDB和MongoDB之间的虚拟联系。
我总结了那篇文章中的答案:
http://www.quora.com/How-does-MongoDB-compare-to-CouchDB-What-are-the-advantages-and-disadvantages-of-each
MongoDB:更好的查询,BSON中的数据存储(更快的访问),更好的数据一致性,多个集合
CouchDB:更好的复制,主从复制和冲突解决,JSON中的数据存储(人类可读,通过REST服务更好地访问),通过map-reduce查询。
总而言之,MongoDB更快,CouchDB更安全。
另外:http://nosql.mypopescu.com/post/298557551/couchdb-vs-mongodb
-
有用的答案,但结论很难。
-
你难以理解的是什么意思?
-
坦率地说,我不记得了......
请注意MongoDB中稀疏唯一索引的问题。我已经打了它,解决方法非常麻烦。
问题是这样的 - 你有一个字段,如果存在,它是唯一的,你希望找到字段不存在的所有对象。在Mongo中实现稀疏唯一索引的方式是缺少该字段的对象根本不在索引中 - 它们无法通过该字段上的查询检索 - {$exists: false}只是不起作用。
我提出的唯一解决方法是使用一个特殊的null值系列,其中一个空值被转换为一个特殊的前缀(如null :)连接到一个uuid。这是一个真正的头痛,因为在编写/查询/阅读时,必须注意转换为空值或从空值转换。一个主要的滋扰。
我从来没有在MongoDB中使用服务器端javascript执行(无论如何都不建议),当只有一个Mongo节点时,它们的map / reduce性能很差。由于所有这些原因,我现在正在考虑查看CouchDB,也许它更符合我的特定情况。
顺便说一句,如果有人知道描述稀疏唯一索引问题的相应Mongo问题的链接 - 请分享。
-
你甚至应该使用稀疏的唯一索引吗?
-
的确,你应该。考虑描述公司的实体。它必须具有唯一的业务编号,并且可能具有业务名称,如果存在,则必须是唯一的。这个例子有点简化,但并不遥远。
-
对不起,我有这种唠叨的感觉,这不是一个好主意,而是我学会了不要忽视的感觉
-
好吧,我无法用一种感觉来争辩。我所知道的是,我需要稀疏的唯一索引,因为可选字段是唯一的(如果存在)。
-
我知道你有一个描述问题的实际用例,但我的直觉呢?
-
我不知道。怎么样?
-
ROTFL。 +1 Alex Ford&标记你的热闹评论。 :-))@ mark,我不确定你列出的问题是否真的有理由从MongoDB切换到CouchDB。我既没有使用过MongoDB也没有使用CouchDB,但是我的直觉告诉我,你会遇到CouchDB的其他一些复杂的限制,并且浪费一些时间来解决它们。如果您现在已经掌握了MongoDB,那么您应该坚持使用它。但同样,我从未进入过Nosql-land,这只是我的直言。
-
我还没有从MongoDB搬到CouchDB。在实际使用之前,CouchDB中有一些我不喜欢的东西。
-
稀疏唯一索引的另一个示例可以是具有national id number字段的client表,根据定义,该字段是唯一的 - 但可以是未知的(可能客户端是外国人)。
-
关键是这个概念有真正的用途,MongoDB只是做得不对。
-
Mongo的Aggregation框架(在版本2.4.8中)比他们的map-reduce工作得更好,在我看来,更容易使用和包裹你的头脑(我敢肯定,如果你习惯map-reduce的情况不是这样的话,我刚刚接受了mongodb类,聚合框架非常灵活)。即将发布的2.6.8将聚合结果作为游标而不是文档返回,从而消除先前应用于mapresult和聚合调用的内存限制。
-
@mark我知道这可能不是很令人满意,但是带着一点点诡计和tom-foolery(已经对我的肠道感觉不好),你可以拥有满足两者的索引。您拥有现有的稀疏唯一索引。然后创建另一个不唯一或稀疏的索引,但在索引中添加另一个字段(在相关字段之后)。然后你可以使用查询提示来强制优化器选择正确的索引(当我测试它时,我需要强制提示稀疏的唯一索引以找到完全匹配/范围,但不需要提示来查找{ $ exists:false})。
-
我的应用程序不是一个大数据,它有一个定义良好的架构。实际上,这是一个非常小的数据。我最后做的是抛弃Mongo并用PostgreSql替换它。就我而言,从一开始就是正确的选择。
-
好决定。我的回答是当你拥有的是一个MongoDB锤子时所做的就是做什么,所以一切看起来像MongoDB钉子。我要添加到第二个索引的另一个小问题是添加你希望从投影中获得的字段,所以至少你得到一个覆盖的查询,不必重复索引。 (例如,如果你只是要取回_id,那么在你的重复索引中添加_id作为第二个字段,这样它就不必提取任何文档并且可以满足索引的投影。)
我相信你可以使用Mongo(更熟悉它),并且非常确定你也可以用沙发。
两者都是面向文档的(基于JSON),因此没有"列"而是文档中的字段 - 但它们可以是完全动态的。
他们都这样做你可能想看看其他使用的因素:你关心的其他功能,受欢迎程度等。谷歌见解,Indeed.com工作岗位将是看待受欢迎程度的方法。
你可以尝试一下我认为你应该可以在5分钟内运行mongo。