CouchDB和MongoDB真的用JavaScript搜索每个文档吗?

时间:2010-10-20 18:48:25

标签: mongodb couchdb

据我所知,这两个“不仅是SQL”数据库。他们搜索每条记录并将其传递给您编写的JavaScript函数,该函数通过查看每个记录来计算返回的结果。

这实际上是如何运作的吗?听起来比使用没有任何索引键的普通RBMS更糟糕。

我构建了我的模式,因此它们不需要连接操作,这使得我对索引的int列进行简单搜索。换句话说,列在RAM中并通过它们快速检查(WHERE user_id IN (12,43,5,2)revision = 4)为数据库提供了一个简单的ID列表,用于查找海量数据集中的实际行。

所以我试图想象一下,在世界上如何通过数据库中的每一行被认为是可接受的(如果确实这是它的工作方式)。也许有人可以纠正我,因为我知道我必须遗漏一些东西。

4 个答案:

答案 0 :(得分:2)

就CouchDB而言,Map函数可以是Javascript,但它也可以是Erlang。 (或者,如果您拉入第三方视图服务器,则完全使用其他语言)

此外,视图以递增方式计算。换句话说,map函数在创建时在数据库中的所有文档上运行,但对数据库的进一步更新仅影响视图的相关部分。

视图的内容在某些方面类似于RDBMS中的索引字段。输出是一组键/值对,可以非常快速地搜索,因为它们存储为b树,一些RDBMS用它来存储它们的索引。

答案 1 :(得分:2)

<强> @Xeoncross

  

我构建了我的模式,因此它们不需要连接操作,这使得我对索引的int列进行简单搜索。换句话说,列在RAM中并通过它们进行快速值检查(WHERE user_id IN(12,43,5,2)或revision = 4)

那么,你会喜欢MongoDB。 MongoDB支持索引,因此您可以索引user_id和revision,此查询将能够相对快速地返回。

但请注意,许多NoSQL数据库仅支持密钥查找,并且不一定支持“二级索引”,因此您必须在此处完成作业。

  

所以我试图想象一下,在世界上如何看待数据库中的每一行都可以被认为是可接受的(如果确实这是它的工作方式)。

如果您在基于SQL的数据库中运行查询,并且您没有数据库将执行表扫描的索引(,即:查看每一行)。

  

他们搜索每条记录并将其传递给您编写的JavaScript函数,该函数通过查看每个记录来计算返回的结果。

所以在实践中,大多数NoSQL数据库都支持这一点。但请不要将它用于实时查询。此选项主要用于执行用于汇总数据的map-reduce操作。

这可能是对NoSQL的不同看法。 SQL非常擅长关系操作,但关系操作不能很好地扩展。许多NoSQL都专注于Key-Value / Document-oriented概念。

SQL的前提是您需要规范化的非重复数据,并且您要在大集合中获取数据。 NoSQL的工作前提是您希望快速查询某些“数据块”,但是您愿意等待依赖于“大集”的数据(在后台运行map-reduce)。

这是一个很大的权衡,但如果在现代网络应用程序上有很多意义。大部分时间用于加载一个页面(博客文章,wiki条目,SO问题),并且大部分数据都与该元素紧密相关或“悬挂”。因此,使用一个查询水平可伸缩查询来获取所需内容的概念非常有用。

这不是解决所有问题的方法,但对于大量用例来说,这是一个非常好的选择。

答案 2 :(得分:1)

认为CouchDB根据“索引”(视图)将文档存储在btree中,并且只是遍历这个树..所以它不会搜索..

请参阅http://guide.couchdb.org/draft/btree.html

答案 3 :(得分:1)

你应该多研究一下。它并不比RDMBS更糟糕不同 ......事实上,鉴于某些领域/功能,“NoSQL”范式比传统方式快得多,在某些意见中,过时的RDMBS实现。想想Google的Big Table平台,你会得到MongoDB,Riak,CouchDB,Cassandra(Facebook)以及许多其他人正在努力实现的目标。主要区别在于,这些NoSQL解决方案中的大多数都集中在键/值存储(有些称为“文档”数据库)上,并且不限于关系概念(在主/外键方面)和连接。对表的连接操作可能非常昂贵。另外,我们不要忘记对象关系阻抗不匹配问题......您不需要ORM来访问MongoDB。它实际上可以存储您的代码对象(或文档),因为它在内存中。你能想象节省代码和复杂性吗? db4o是另一种轻量级解决方案。

当你说“不仅是SQL”数据库时,我不知道你的意思?这是一个NoSQL范例 - 其中没有SQL用于查询系统的底层数据存储。 NoSQL也意味着不是通常构建在SQL之上的RDBMS。虽然,MongoDB确实有类似SQL的语法,可以在检索数据时从.NET中使用 - 它叫做NoRM。

我会说我只与Riak和MongoDB合作过......我对Cassandra或CouchDB并不熟悉阅读水平和功能集理解。我更喜欢使用MongoDB。 Riak也很好,但不是我需要的。您应该下载一些NoSQL解决方案,您将获得这个概念。查看db4o,MongoDB和Riak,因为我发现它们是最简单的,支持基于.NET的语言。它对某些应用程序才有意义。总而言之,NoSQL或Document数据库或OODBMS ...无论你想要什么,它都非常吸引人并且获得了很多动作。

我也忘了你的javascript问题...... MongoDB有JavaScript“绑定”,可以将它用作搜索一个方法来获取数据。 Riak通过JSON格式处理数据。 MongoDB使用BSON我相信,我不记得其他人使用的。在任何情况下,重点是SQL(结构化查询语言)来“询问”数据库中的一些信息(MongoDB是其​​中之一)使用Javascript和/或RESTful语法向NoSQL系统询问数据。我相信可以通过HTTP查询CouchDB和Riak,这使得它们非常容易访问。更不用说,这很酷。

做你的研究....下载它们,它们都是免费的OSS。

db4o:http://www.db4o.com/(Java和.NET版本)

MongoDB:mongodb.org /

Riak:http://www.basho.com/Riak.html

NoRM:http://thechangelog.com/post/436955815/norm-bringing-mongodb-to-net-linq-and-mono

相关问题