【问题标题】:MongoDB/MongoID multikey special queryMongoDB/MongoID 多键特殊查询
【发布时间】:2011-04-25 07:49:54
【问题描述】:

我有两个集合:新闻和订阅。每个新闻项目都有一个字符串数组 - “标签”。每个订阅也有这样的“标签”。

订阅的新闻项目是具有所有订阅标签的项目,并且可能更多。新闻项目的订阅是具有该项目任何标签的订阅,但不再有。

当我想获得订阅的消息时,我在 Ruby MongoID 上做这样的请求:

NewsItem.where(:tags.all => @subscribe.tags)

如何获得某个新闻的所有订阅?

例如:

item.tags = ["foo", "bar"]

subscribe1.tags = ["foo"]
subscribe2.tags = ["bar"]
subscribe3.tags = ["foo", "bar"]
subscribe4.tags = ["foo", "bar", "baz"]

item.subscribes 应该给 subscribes 1..3,但 subscribe4 不应该包含在内,因为它有一个“baz”标签,它不包含在 item.tags 中

【问题讨论】:

  • 我不是 100% 清楚这里的预期。您能否提供:示例对象、预期的查询结果。这将帮助我们制作适当的查询。
  • 我已经编辑了例子,希望你能理解。

标签: ruby-on-rails mongodb mongoid nosql


【解决方案1】:

根据您的描述,您并不真正想要$all。相反,您正在寻找某种形式的 $subset 运算符。有 JIRA request 就是这样的事情,但目前还没有实现。

【讨论】:

  • 这正是我所需要的。很遗憾,它还没有实现。
【解决方案2】:

您应该执行匹配的“在 newsitem 创建时”,因此您可以按需且频繁地执行此操作。把查询转过来做

Subscriber.all_in(tags: news_item.tags)

查找拥有newsitem 的所有标签的订阅者。这是你想要的吗?

无论如何,如果订阅者众多,这将很快变得非常密集。您可以使用延迟作业在后台处理它。您应该尝试展平数组或设置其他键以索引和加快搜索速度。

【讨论】:

  • 不,这不是我想要的。您展示的方式(使用 all_in)它将使 ["foo", "bar", "baz"] 订阅新闻项目 ["foo", "bar"]。我问的原因是任何 MongoDB 标准运算符(例如 $in、$nin、$all 等)都不提供此功能。此外,我使用后台作业,但在此作业中执行新闻项目列表缓存我需要获取每个新闻项目的订阅列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
相关资源
最近更新 更多