MongoDB / MongoID多键特殊查询

时间:2011-04-25 07:49:55

标签: ruby-on-rails mongodb mongoid nosql

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

订阅的新闻项目是具有订阅的所有标签的项目,可能更多。新闻条目的订阅是订阅,包含任何此项目的标签,但不再有。

当我想获得订阅的新闻时,我正在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应该给予订阅1..3,但不应该包含subscribe4,因为它有一个“baz”标记,不包含在item.tags中

2 个答案:

答案 0 :(得分:1)

根据您的说明,您实际上不需要$all。相反,您正在寻找一些表单$subset运算符。这样的事情只有JIRA request,但目前尚未实施。

答案 1 :(得分:0)

您应该在“newsitem创建”上执行匹配,因此您可以按需和频繁地执行此操作。转动查询并执行

Subscriber.all_in(tags: news_item.tags)

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

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