假设我收集了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或Y的属性)。
示例查询:
给我前10个带有标签网站和文件的文件 购物,关键字匹配“发饰或时尚” 并使用contact_via包括“email”。
给我第二批20个带有“网站”标签的文件 “信任”,匹配关键词“发胶”或“发饰”。
给我50个带有“网站”标签的文件。
我还需要通过文档中的其他字段来订购这些 (分数类型)或创建或更新日期。所以基本上有四个“范围”定期查询。
我开始基于SQL。然后,我转移到Mongo,因为它支持阵列和哈希(我喜欢)。但是,它不支持使用索引的多个范围,因此我的Mongo数据库很慢。因为它无法使用索引并且必须扫描1000万个文档。
有没有更好的选择。这阻碍了将此应用程序转移到生产中(以及随之而来的收入)。对于正确的数据库或替代架构的任何想法将不胜感激。
如果重要的话,我在Ruby / Rails中。
答案 0 :(得分:2)
当需要对数组进行多次查询时,我们发现最好的解决方案,至少对我们来说,是与ElasticSearch一起使用。我们得到了这个,加上其他一些奖金。而且,我们可以降低Mongo的索引要求..所以这是一个双赢。
答案 1 :(得分:1)
我的两分钱是针对MongoDB的。您的数据不仅可以作为原始Ruby哈希表示,保存和加载,而且Mongo现代且快速,而且非常容易知道。以下是启动Mongo服务器所需的全部内容:
mongod --dbpath /path/to/dir/w/dbs
然后只需调用mongo
来获取控制台,它只是一个基本的JavaScript控制台。使用它就是这么简单:
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)!'}]