2017-01-20 77 views
0

我有這樣MongoDB中包括數組查詢結果爲空

{ 
    _id: ObjectId("53ea4bcb311164af033743fd") 
    "users": [ 
    { 
     "name": "Paul" 
     "age": 36 
    }, 
    null, 
    { 
     "name": "Steve", 
     "age": 74 
    } 
    ] 
} 

一個MongoDB的文件我可能沒有最好的設計選擇,但我決定使用數組作爲用戶鑰的索引。 現在,我想提高我的查詢的性能,只需使用必要的字段我的查詢投影,所以查詢看起來是這樣的:

db.accounts.findOne('53ea4bcb311164af033743fd', {'users.name': 1}); 

這將返回

{ 
    _id: ObjectId("53ea4bcb311164af033743fd") 
    "users": [ 
    { 
     "name": "Paul" 
    }, 
    { 
     "name": "Steve" 
    } 
    ] 
} 

現在有什麼辦法還包括null,所以這個指數是正確的?我知道它只適用於投影{'users': 1},但這對我來說表現不夠好,因爲我的用戶對象中有相當多的值。

回答

0

正如你在你的問題中提到的那樣,考慮到你的數組沒有存儲齊次對象,而是空值和文檔,這可能不是你的用例最適合的實現。

您的findOne命令不帶空值,因爲您正在請求數組字段中每個對象的名稱爲「name」的字段。

通過嵌入字段'name'和'age'的文檔來實現1:N關係是一個冒險和脆弱的決定,可能會導致超過最大文檔大小16MB,如MongoDB documentation中所述。

瞭解更多關於您的應用程序和您所引用的集合的用法,以便全面瞭解您正在實施和建議的內容將會非常有用。

+0

謝謝恩裏克! 16MB限制對我來說並不是什麼大問題,因爲每個賬戶都有自己的文檔和與之關聯的用戶 - 而且對最大用戶數量有限制。現在我通過向用戶添加密鑰並引用這些來解決問題。一些重構是必需的,但仍然是我的問題的最佳解決方案。 – tn4foxxah