首先,我敢肯定,你的意思是「標籤」其實是一個數組,因爲否則的結構將是無效的:
{ "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查詢真的是。
很好 - 這部分解決了我建立mongo標準的問題。我仍然需要遍歷所有的篩選器類別,並且只爲那些至少有一項檢查的項目插入標準。另外,我實際上將標籤存儲在單獨的集合上 – 2014-11-03 13:18:25