2012-07-29 32 views
2

我不能準確地描述語言表達我的想法,所以這裏有一個例子:MongoDB的 - 如何在一個數組訪問對象

[ 
    { 
    'description': 'fruits', 
    'examples': [ 
     { 
     'name': 'Apple', 
     'color': ['red', 'green'] 
     }, 
     { 
     'name': 'Banana', 
     'color': 'yellow' 
     } 
    ] 
    }, 
    { 
    'description': 'vegetables', 
    'examples': [ 
     { 
     'name': 'Tomato', 
     'color': 'red' 
     }, 
     { 
     'name': 'Carrot', 
     'color': 'orange' 
     } 
    ] 
    }, 
    { 
    'description': 'Wweets', 
    'examples': [ 
     { 
     'name': 'Chocolate', 
     'color': ['brown', 'black', 'white'] 
     }, 
     { 
     'name': 'Candy', 
     'color': 'various' 
     } 
    ] 
    } 
] 

讓我們走一步看一步:

如果我想看到所有食品類別,我用下面的命令

db.food.find() 

我想看到的蔬菜查詢

db.food.find({ 'description': 'vegetables' }) 

現在我們假設我忘了胡蘿蔔長得怎麼樣(哈哈)。我該怎麼辦?我嘗試以下(本地Node.js的MongoDB的驅動程序):

collection.find({'examples.name': 'Carrot'}, function(err, example){ 
    console.log(example) 
    // It still returns me the whole object! 
}); 

因此,我預計的MongoDB返回對象的下一個最大的實例。例如,我想這樣做。

console.log(example.color) 
// 'orange' 

你有什麼想法嗎?我是面向文檔的數據庫新手:/

+0

嘿,隨着發現,你得到的整個文件,你不能得到一部分。所以,你得到的文件,並通過一個小函數尋求索引;) – 2012-07-29 22:52:54

+0

嘿,這個小函數是怎麼樣的? :)我能在我的節點應用程序中實現它嗎?我對這件事情很陌生。 – aydio 2012-07-30 05:33:54

+0

看aydio的答案;)所以,你創建一個lib,用這個函數進行基本操作。你需要。 ;)編輯:哦,這是你大聲笑 – 2012-07-30 11:56:17

回答

2

當您將一堆對象存儲在單個文檔中時,您將(默認情況下)取回整個文檔。 [*]

當文檔的其中一個字段是數組時,如果在數組中找到要匹配的項目,則將返回完整數組。

如果你通常只會收回這些東西的一個子集,不要試圖將所有東西都塞進單個文檔中。

你有一種備選:

您可以儲存食物,每一個食品有田「字型」,這是「果」或「植物油」或集合「......」。你仍然可以查詢所有食物,或只是「水果」類型的食物,或者只是名稱爲「胡蘿蔔」的食物等。

數組對於特定對象/文檔的屬性列表來說很棒,它們不是很好當你把文件塞進他們那裏,然後你想回到一流的對象。

[*]有一種方法可以投影並獲取字段的一個子集,但仍然會返回整個字段。

+0

感謝您的澄清。昨天我以爲我有一個非常高效的一天,因爲我幾乎完成了整個平臺的編程,但現在我卡住了,我可能不得不重新考慮我的文檔結構...... :(也許我最終會做對象引用,但那會錯過了mongodb的點...我會尋找其他解決方案 – aydio 2012-07-30 05:32:18

+0

a)我不明白爲什麼你需要對象引用和b)我不明白爲什麼這會錯過mongoDB的點... – 2012-07-30 09:57:58

+0

對象引用因爲我現在的模型是非常深層嵌套的,會導致這樣的問題。就我所知,MongoDB遵循將數據存儲在相應對象中的原則(直接在帖子內保存註釋等)。)但正如我所說,我對於面向文檔的數據庫完全不熟悉,所以不要把我的話寫得太嚴肅 - 我只是想學習...... – aydio 2012-07-30 10:32:13