2011-04-25 49 views
2

我有两个集合:新闻和订阅。每个新闻都有一系列字符串 - “标签”。每个订阅也有这样的“标签”。MongoDB/MongoID多键特殊查询

订阅的新闻项目是订阅所有标签的项目,可能更多。新闻项目的订阅是订阅任何这个项目的标签,但没有更多。

当我希望得到一个订阅的新闻,我的红宝石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不应包括在内,因为它不包括在item.tags

一个“巴兹”标签
+0

我不是100%清楚这里的预期。你能够提供:样品对象,预期的查询结果。这将有助于我们制定恰当的查询。 – 2011-04-26 06:28:44

+0

我编辑过的例子,所以我希望你能理解它。 – sandrew 2011-04-26 14:07:20

回答

1

根据您的描述,您并不需要$all。相反,您正在寻找某种形式的$subset运营商。对于这样的事情,有JIRA request,但是它现在还没有实现。

+0

这实际上是我需要的。可悲的是,它还没有实施。 – sandrew 2011-04-27 08:09:29

0

您应该执行匹配“在newsitem创建”,因此您按需要和频繁地执行此操作。打开查询身做

Subscriber.all_in(tags: news_item.tags) 

找到具有newsitem的所有标签的用户。这是你想要的吗?

在任何情况下,对于许多用户来说,这将很快变得非常密集。您可以使用延迟作业在后台处理它。您应该尝试平展阵列或设置其他键以便索引和加速搜索。

+0

不,那不是我想要的。你显示的方式(用all_in)会给[“foo”,“bar”,“baz”]订阅新闻条目[“foo”,“bar”]。我问的原因是任何MongoDB标准运算符(例如$ in,$ nin,$ all等)都不提供此功能。此外,我使用后台作业,但在这份工作中执行新闻项目列表缓存,我需要获取每个新闻项目的订阅列表。 – sandrew 2011-04-25 09:37:56