2014-11-03 88 views
1

流星應用程序,我有一個有標籤字段的mongo集合。Meteor和Mongo以及標籤過濾器

[{name: "ABC", tags: {"@Movie", "#free", "!R"}}, 
{name: "DEF", tags: {"@Movie", "!PG"}}, 
{name: "GHI", tags: {"@Sports", "#free"}}] 

在我的用戶界面上,根據標籤名稱的第一個字母,有三組複選框被動態填充。

filter group 1: [ ]Movie [ ] Sports 
filter group 2: [ ]free 
filter group 3: [ ]PG [ ]R 

濾波器邏輯如下:

  • 如果濾波器組是空的,則沒有通過從濾波器組中的任何複選框被選中該濾波器組
  • IF濾波器,然後應用該過濾器
  • $並且應該應用於過濾器組之間(如果電影和R被選中,則只應選擇標記名爲「!Movie」和「#free」的文檔

我正在努力構建遵循上述邏輯的mongo標準參數。我的代碼目前看起來像有大量嵌套ifs的意大利麪條(僞代碼)

if(filter_group1 is empty)then if(filter_group2 is empty)then mongo_criteria = {_id:$ in:$(「input:checked」, 「.filtergroup1」)。map(function(){return this.value})}

這樣做的正確方法是什麼?

回答

2

首先,我敢肯定,你的意思是「標籤」其實是一個數組,因爲否則的結構將是無效的:

{ "name": "ABC", "tags": ["@Movie", "#free", "!R"]}, 
{ "name": "DEF", "tags": ["@Movie", "!PG"]}, 
{ "name": "GHI", "tags": ["@Sports", "#free"]} 

它存儲的「標籤」的數據這樣一個新的想法,但它似乎你的程序邏輯構建查詢需要知道,至少有「三種」可能的條件需要在$and組合中考慮。

在最簡單的形式,你只允許一個選擇每個過濾器組,然後你可以逃脫與$all運算符出來。只需簡單的MongoDB外殼符號爲簡潔:

db.collection.find({ "tags": { "$all": [ "@Movie", "!R" ] } }) 

的問題存在,如果你想在一組多重選擇,比如說評級例如,那麼這將無法得到一個結果:

db.collection.find({ "tags": { "$all": [ "@Movie", "!R", "!PG" ] } }) 

實際上沒有任何項目包含這些評級值,所以這不會有效。所以你寧願這樣做:

db.collection.find({ "$and": [ 
    { "tags": { "$in": [ "@Movie" ] } }, 
    { "tags": { "$in": [ "!R", "!PG" ] } } 
]) 

這將正確匹配所有電影與「R」和「PG」的評級標籤。延伸到其他的基團基本上是推動另一個數組項到$and表達式:

db.collection.find({ "$and": [ 
    { "tags": { "$in": [ "@Movie" ] } }, 
    { "tags": { "$in": [ "!R", "!PG" ] } }, 
    { "tags": { "$in": [ "#free" ] } 
]) 

獲取僅包含每個這些濾波器的匹配值「類型」的文件,因此,「PG」電影是不免費和「體育」被過濾出來,而不是添加到選擇。

構建查詢的基礎知識使用每個過濾器組中的$in的一組選擇選項。當然,當過濾器組中存在選擇時,您只能附加到$and陣列。

所以用鹼$and像這樣開頭:

var query = { "$and":[{}] }; 

然後在每一個每個濾波器組在檢查選項添加到了自己在:

var inner = { "tags": { "$in": [] } }; 
inner.tags["$in"].push(item); 

然後追加到基本查詢:

query["$and"].push(inner); 

沖洗並重復每個項目。這是完全有效的,因爲基本查詢只會選擇所有未經過濾的,這也是不增建邏輯有效:

db.collection.find({ "$and": [ 
    { }, 
    { "tags": { "$in": [ "@Movie" ] } }, 
    { "tags": { "$in": [ "!R", "!PG" ] } }, 
    { "tags": { "$in": [ "#free" ] } 
]) 

所以這真的可以歸結爲MongoDB的瞭解它的查詢敷設渠道。這實際上只是構建數據結構中的簡單JavaScript數組操作。這是所有的MongoDB查詢真的是。

+0

很好 - 這部分解決了我建立mongo標準的問題。我仍然需要遍歷所有的篩選器類別,並且只爲那些至少有一項檢查的項目插入標準。另外,我實際上將標籤存儲在單獨的集合上 – 2014-11-03 13:18:25