2012-12-12 66 views
2

我已經閱讀了關於MongoDB中投影的所有信息。我希望這很簡單,我錯過了它,因爲Mongo查詢的壓倒性靈活性。MongoDB查詢 - 限制名稱匹配模式的字段

在我們的MySql數據庫中,我們採用了一種商業慣例,即在「隱藏」字段前加下劃線。我們的應用程序知道如何隱藏這些字段。

移動一些數據到mongo,我需要檢索文件,,所有下劃線前綴字段被省略。當然這應該在查詢中完成,而不是在檢索後進行文件操作。

像$ regex,$ in,$等所有運營商似乎都適用於。我需要根據名稱構建一個忽略未知數量字段的投影。例如:

db.coll.find({}, {"_*": 0}) 

當然,這不起作用,但解釋了這個想法。

我應該注意:這是必要的,因爲這些文檔是我們的應用程序用戶可編輯的,所以我不知道模式可能是什麼樣子。我知道我們的「內部」字段帶有_前綴,並且需要通過編輯器的省略來保護這些字段。

希望這很容易...

回答

1

你可以有一個單獨的字段作爲hidden_fields什麼的。請參閱以下架構。

{_id: 'myid1', hidden_fields: {"_foo": "bar", "_foo2": "bar2"}, key1: value1 ...} 

現在上述模式的基礎上,就去做,

db.collection.find({ ... }, {hidden_fields: 1}) 

這將顯示隱藏字段。您也可以在子文檔中的字段上使用索引,因此在性能方面也不會有任何損失。

+0

所有的回覆都很棒,並幫助我瞭解設計中的固有缺陷。我已經實現了Sushant建議的反面 - 我的所有文檔在根級別都有一個固定的模式,並且有一個「內容」節點。我只會將內容節點呈現給我的用戶,因此會保護文檔的所有其他部分。 – hikaru

0

有沒有這個功能很好的理由。實現這種功能將是一場噩夢,它不會擴展,也不會很快。

到目前爲此,最好的辦法是建立一個key-value存儲,如:

{ 
    fields: [ 
     {k: "_ghhg", v: 5}, 
     {k: "ghg", v: 6} 
    ] 
} 

你會那麼$regexk實地瞭解哪個鍵的名稱(領域)在他們已經強調。

作爲一條建議,我強烈建議使用前綴$regex s,因爲它們在使用您創建的索引時更有效,即對於您顯示的查詢:^_*

將一些數據移動到mongo,我需要檢索文檔,並省略所有下劃線前綴字段。當然這應該在查詢中完成,而不是在檢索後進行文件操作。

我會親自做這個客戶端,它會比數據庫端快100倍。

0

正如@Sammaye提到的,MongoDB不支持以自然/有效的方式進行這種查詢。

但是,如果您不需要內部數據,爲了優化性能,我建議您考慮創建兩個文檔,一個包含始終可用的數據,另一個包含「_internal」字段。 MongoDB將讀取和寫入較少,並且在客戶端上操作的次數會減少。這與在RDBMS中使用兩個表(一個使用公共數據,另一個使用私有數據)類似。

這可以通過更新整個文檔(如果可能在您的方案中)更簡單地更新非內部數據。

當然,您也可以刪除多餘的「_」字符,因爲這隻會爲BSON數據添加額外的不必要字符。 :)