2011-04-25 46 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