草庐IT

mongodb - Couchdb 中任意谓词查询的策略

coder 2023-10-30 原文

我们有一个应用程序可以从使用基于文档的数据存储(如 CouchDB)中获益匪浅。但是我们有一个查询用例,我正在努力使用 Map Reduce 来实现它。

我们的文档实际上只包含两种类型的数据:

  1. 数字属性
  2. bool 属性

bool 属性本质上将文档标记为属于一个或多个非排他性集合。数字属性将始终只需要求和。构建文档的一种方法是这样的:

{
  "id": 3123123,
  "attr": {"x": 2, "y": 4, "z": 6},
  "sets": ["A", "B", "C"]
}

使用这种结构,可以很容易地计算出集合 A、B 和 C 的聚合 x、y、z 值,但是当您想查看 A&C 等交叉点的聚合时,它会变得更加复杂。

在这个小案例中,我可以为 ABC 的所有排列(“A、B、C、AB、AC、BC、ABC”)发出 key ,但我担心这将如何扩展。我们的文档可能属于 80 组的某种组合,它前面是一个用户界面,可以构建它们的任何可以想象的组合。

我倾向于认为这不是 CouchDB 的工作,也许 MongoDB 或其他东西更适合这个问题。

我错过了什么吗?

最佳答案

可以高效计算和缓存所有这些值的数据结构将非常复杂。我不确定是否有任何数据库系统能够在不迭代子集的情况下执行此操作。交集是出了名的困难操作,而 CouchDB 实际上并没有任何可用的东西来正确处理交集。

正如您正确识别的那样,发出所有排列(子集,准确地说)将占用大量内存,因为它仍然会将您的项目乘以一个巨大的因子(2n n 个集合的键值对)。您可以通过将前缀折叠在一起来减少这种情况(CouchDB 键结构允许您检索 ["A"]["A","B"] 的值,当您使用组级别选项为 ["A","B","C"] 发射)但仅发射 2 倍(2n-1 键值对 n 组)。

因此,如果您的项目平均有 3 个关联集,您会没事(4 个键值对而不是 3 个),但是 4 个关联集更重(8 个而不是 4 个)并且五个开始变得烦人(16 而不是 5)。这也使得具有许多关联集的项目容易受到性能问题的影响(一个 10 集的项目将创建超过 500 个键值对)。

中间方法是发出最多四组长度的键(它只会使所需的内存加倍),并在需要更深的交集时运行一些应用程序端处理(捕获所有项目而不减少,运行减少在应用程序中)。运气好的话,相关项的数量会减少 - 如果不是,您始终可以使用最大集合大小来牺牲更多内存以获得更高性能。

相反的方法是让应用程序在插入/更新每个文档时更新 2n 总计(通过获取与当前项的子集匹配的所有“总计”文档)。这些总计将存储在不同的数据库中,并可以按键查询。如果您能够负担得起动态更新总计(或者您的架构允许您通过监听主数据库中的更新来更新它们),那么这种方法会更好,因为它可以使查询快如闪电。

关于mongodb - Couchdb 中任意谓词查询的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4780318/

有关mongodb - Couchdb 中任意谓词查询的策略的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  3. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  4. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  5. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  6. ruby-on-rails - solr 清理查询 - 2

    我在Rails上使用带有ruby​​的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s

  7. ruby-on-rails - Rails 3 在一个查询中包含多个表 - 2

    我正在为锦标赛开发一个Rails应用程序。我在这个查询中使用了三个模型:classPlayertruehas_and_belongs_to_many:tournamentsclassTournament:destroyclassPlayerMatch"Player",:foreign_key=>"player_one"belongs_to:player_two,:class_name=>"Player",:foreign_key=>"player_two"在tournaments_controller的显示操作中,我调用以下查询:Tournament.where(:id=>params

  8. ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询? - 2

    我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使

  9. ruby-on-rails - 在不重新查询数据库的情况下重新排序 Rails 中的事件记录? - 2

    例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果

  10. ruby-on-rails - 带句点(或句号)的 Rails 查询字符串。 - 2

    我目前正在尝试了解RoR。我将两个字符串传递到我的Controller中。一个是随机的十六进制字符串,另一个是电子邮件。该项目用于对数据库进行简单的电子邮件验证。我遇到的问题是当我输入如下内容来测试我的页面时:http://signup.testsite.local/confirm/da2fdbb49cf32c6848b0aba0f80fb78c/bob.villa@gmailcom我在:email的参数散列中得到的全部是'bob'。我在gmail和com之间留下了.,因为那样会导致匹配根本不起作用。我的路由匹配如下:match"confirm/:code/:email"=>"conf

随机推荐