2011-01-29 164 views
0

我正在使用MongoDB來存儲一堆信息,並且需要搜索索引數組的值。MongoDB數組索引搜索

這裏的模式:

{ "common_name" : { "name" : "thename", "type" : "thetype" } } 

有文檔中的其他值,但是這是唯一一個我在尋找。

所以,我估計像這樣的工作:(中殼)

db.collection.find({common_name:{$in:"thename"}}) 

但我得不到任何回報。

這看起來就像這裏所做的一樣: http://www.php.net/manual/en/mongo.queries.php - 但我似乎無法得到任何回報。

我已經試過

db.collection.find({"common_name.name":"thename"}}) 

和它的作品如預期,但對指數(最多4個)搜索多個節點,它可能會變得非常惡劣,基本定義$或索引的每個子類,和四倍我的查詢時間。因爲這是一個自動補全的動力,我不能那樣做。

奇怪的是,以下不返回任何證件之一:

db.collection.find({"common_name":{"name":"thename"}}) 

這在我的理解,是完全一樣的東西上面的查詢。

我對Mongo很新,所以也許我在這裏錯過了一些大東西?

有關如何快速訪問這些數據(使用錨定正則表達式)的任何想法?

我可以只使用一個關係表,但是不會破壞像Mongo這樣的NoSQL系統的目的嗎?

回答

2

問題是你沒有數組。一個數組看起來像{ "common_name" : [ "name1", "name2", "name3" ] }

使用這樣的結構,Mongo可以將數組的元素索引到單個索引中,並快速找到包含數組中任何單個項目的任何文檔。

可能使用一個數組,並簡單地定義偏移量是你想要的,例如, [0]是名稱,[1]是類型等等。有了這個功能,您現在可以快速找到任何文檔。

可以做到這一點除了以保持數據的命名字段(但很明顯,這將增加存儲所以不推薦)。

如果您的自動完成功能不需要將最新的文檔添加到集合中即可完全更新,您可以運行map-reduce作業來構建您僅用於自動完成的單獨集合。地圖步驟將爲文檔中的每個單獨的名稱字段發出(因此排出後的文檔數量是文檔的4倍),減少步驟將計算每個名稱的數量(因此,所有字段中的唯一名稱數量是1x) 。您可以通過名稱和計數索引產生的集合,這將允許您的自動完成功能首先推薦最常用的名稱。

+0

啊,我擔心這可能是問題所在。我會改變我的模式以這種方式工作。要麼我誤解了這裏的PHP文檔http://www.php.net/manual/en/mongo.queries.php,或者他們是不正確的。謝謝! – Jesse 2011-01-29 21:00:04

0

db.collection.find({"common_name":{"name":"thename"}})對我來說,這和上面的查詢完全一樣。

不,這不是因爲這將只匹配如果common_name值將只是name: thename},你想要的$elemMatch操作。