2012-11-01 45 views
3

在MongoDB中,在MongoDB中你如何查詢僅包含某些字段的記錄,並沒有其他

要查詢包含某些字段的記錄,你可以這樣做:

collection.find({'field_name1': {'$exists': true}}) 

這將返回任何記錄具有'field_name1'字段集...

但你如何查詢mongo查找包含只有'field_name1'(並沒有其他字段)的記錄?我希望能夠做到這一點,例如,一個字段列表。

+0

可能是重複的http://stackoverflow.com/questions/13117381/how-to-exclude-from-search-results-documents-with-fields-which-are-not-present-i/13118087#13118087 – Sammaye

回答

3

令人難過的答案,就像您經常在MongoDB和其他NoSQL數據庫中發現的那樣,可能最好是以儘可能簡單的方式來查詢數據。

這就是說,有這樣做的方法,但據我所知,它需要你執行JavaScript服務器端。這會很慢,並且不可能利用MongoDB的索引和其他邏輯特性,所以只有在絕對必要時才使用它,如果性能非常重要。

因此,最簡單的方法是創建一個函數,該函數返回對象中的字段數量,我們可以使用這個查詢語法的$where。這使您可以針對您的數據運行任意的JavaScript查詢,並且可以與普通的語法查詢結合使用。不幸的是,我的JavaScript-fu有點虛弱,所以我不知道如何(或者如果)在單行程中獲得JS對象的數量,所以爲此,我會store a function server side

從蒙戈外殼,執行以下命令:

db.system.js.save(
    { 
     "_id" : "countFields", 
     "value" : function(x) { i=0; for(p in x) { i++; } return i} 
    } 
) 

就這樣,你有一個保存的JavaScript函數,服務器端,稱爲countFields返回對象中的元素的數量。現在,你需要與$where查詢來執行您的查找操作:

db.collection.find({ 
    'field_name1': {'$exists': True}, 
    '$where' : 'countFields(this)==2' 
}) 

這將使你只有滿足這兩個條件$exists$where條款的文件。請注意,我在示例中與2進行比較,因爲countFields函數計數爲_id作爲字段。

相關問題