2012-01-14 56 views
11

選擇子文檔我有一個集合與子文檔標籤像:如何使用MongoDB的

Collection News : 
    title (string) 
    tags: [tag1, tag2...] 

我要選擇誰所有帶有圖案啓動標籤,但只返回匹配的標籤。

我已經使用正則表達式,但它返回一個包含匹配的標籤的所有新聞,這裏是查詢:

db.news.find({"tags":/^proga/i}, ["tags"]).sort({"tags":1}). 
    limit(0).skip(0) 

我的問題是:我怎樣才能檢索到所有的標籤(只),誰的模式相匹配? (最終目標是使自動完成場)

我也使用不同的嘗試,但我沒有找到一種方法,使一個獨特的帶的發現,它總是返回我所有的標籤:(

感謝您的時間

回答

10

嵌入式文件都沒有收藏看看你的查詢:。DB 新聞 .find將從news集合返回文檔tags不是一個集合,並不能過濾

。我在那裏這是針對這個「虛擬收集功能」(SERVER-142)的功能請求,但不要期望看到這個過早,因爲它是「已計劃但未計劃的」。

您可以過濾客戶端,或將標籤移動到單獨的集合。由retrieving only a subset of fields - 只有tags字段 - 這應該是相當快。

提示:您的正則表達式使用/i標誌,這使得不可能使用索引。你的db字符串應該是大小寫正常化的(例如全部大寫)

+0

感謝您的回答,我會盡量讓另一個集合「標籤」女巫可以包含我所有的標籤,並在這一個上做過濾器(但不確定它是否以NOSQL方式) – Mush 2012-01-14 19:19:00

13

晚會有點晚,但希望能幫助其他人尋找解決方案。我已經找到了一種使用聚合框架來完成這項工作的方法,通過將它們鏈接在一起,將$ project和$ unwind與$ match結合在一起。我一直在使用PHP做,但你應該得到的要點:

$ops = array(
     array('$match' => array(
       'collectionColumn' => 'value', 
      ) 
     ), 
     array('$project' => array(
       'collection.subcollection' => 1 
      ) 
     ), 
     array('$unwind' => '$subCollection'), 
     array('$match' => array(
       subCollection.subColumn => 'subColumnValue' 
      ) 
     ) 
    ); 

第一場比賽和項目只是用它來過濾掉,使其更快,然後子集合開卷逐項吐出每一個子集合項目其然後可以使用最終匹配進行過濾。

希望有所幫助。

UPDATE(從瑞安Wheale):

然後,您可以$group數據返回到其原來的結構。這就像一個$elemMatch它返回一個以上的子文檔:

array('$group' => array(
     '_id' => '$_id', 
     'subcollection' => array(
      '$push' => '$subcollection' 
     ) 
    ) 
); 

我翻譯這個從節點到PHP,所以我沒有在PHP測試。如果有人想要Node版本,請在下面留言,我會承擔責任。

+1

老兄,純粹的天才。當我發現這一點時,我無法描述燈泡熄滅。您也可以將這些項目重新組合爲原始結構。我需要相當於$ elemMatch的投影,這會比第一個結果返回更多。謝謝!! – 2014-05-25 00:21:44