0

假设我有一个包含 1000 万个文档的集合,看起来像这样:

{
"_id": "33393y33y63i6y3i63y63636",
"Name": "Document23",
"CreatedAt": "5/23/2006",
"Tags": ["website", "shopping", "trust"],
"Keywords": ["hair accessories", "fashion", "hair gel"],
"ContactVia": ["email", "twitter", "phone"],
"Body": "Our website is dedicated to making hair products that are..."}

我希望能够在数据库中查询任意数量的标签、关键字和 ContactVia 的 3 个属性中的任何一个,包括 0 个。我需要能够通过 ANDS(本文档包括 X 和 Y 的两个属性)或 OR(本文档包括 X OR Y 的属性)进行选择。

示例查询:

  • 给我前 10 个具有标签 website 和 shopping 的文档,关键字匹配“hair Accessories or fashion”,contact_via 包括“email”。

  • 给我另外 20 个带有标签“网站”或“信任”的文档,匹配关键字“发胶”或“发饰”。

  • 给我 50 个带有“网站”标签的文档。

我还需要按文档中的其他字段(分数类型)或创建或更新日期对这些进行排序。所以基本上有四个定期查询的“范围”。

我一开始是基于 SQL 的。然后,我搬到了 Mongo,因为它支持数组和哈希(我喜欢)。但是,它不支持使用索引的多个范围,所以我的 Mongo 数据库很慢..因为它不能使用索引并且必须扫描 1000 万个文档。

有没有更好的选择。这阻碍了将该应用程序投入生产(以及随之而来的收入)。任何关于正确数据库或替代架构的想法将不胜感激。

如果这很重要,我在 Ruby/Rails 中。

4

2 回答 2

2

当需要对数组进行多次查询时,我们发现至少对我们来说最好的解决方案是使用 ElasticSearch。我们得到了这个,加上其他一些奖金。而且,我们可以减少对 Mongo 的索引要求......所以这是双赢的。

于 2012-07-25T21:13:15.027 回答
1

我的两分钱用于 MongoDB。不仅可以将您的数据表示、保存和加载为原始 Ruby 哈希,而且 Mongo 是现代且快速的,并且非常非常容易了解。以下是启动 Mongo 服务器所需要做的一切:

mongod --dbpath /path/to/dir/w/dbs

然后要获取控制台,它只是一个基本的 JavaScript 控制台,只需调用mongo. 使用它就是这么简单:

require 'mongo'
db = Mongo::Connection.new['somedb']
db.stuff.find #=> []
db.stuff.insert({id: 'abcd', name: 'Swedish Chef', says: 'Bork bork bork!'})
db.stuff.find #=> [{id: 'abcd', name: 'Swedish Chef', says: 'Bork bork bork!'}]
db.stuff.update({id: 'abcd', {'$set' => {says: 'Bork bork bork!!!! (Bork)!'}}})
db.stuff.find #=> [{id: 'abcd', name: 'Swedish Chef', says: 'Bork bork bork!!!! (Bork)!'}]
于 2012-07-22T23:41:53.590 回答