2013-08-26 144 views
1

嗨i'm完全新手用MongoDB的,我來自SQL Server中,我有以下疑問 如果有波紋管結構:構建查詢

專輯:電視

"_id": ObjectId("123456abc"), 
"brand": "Sony", 
"model": "Bravia", 
"price": 1000 

收藏:tvcomments

"_id": "_id": ObjectId("456789def"), 
"tv": ObjectId("123456abc"), 
"comments": [ 
     { 
      "user": ObjectId("413212eop"), 
      "text": "Very nice TV" 
     } 
] 

我倒是希望得到電視機與他們的意見,但我不覺得一個例子來做到這一點,也許是不可能的?

+1

'db.tvcomments.find({電視:object_id_of_tv_document})'? – Sammaye

+0

總是可以在電視集合中創建另一個名爲「評論」的字段,然後只需從那裏拉取信息。否則,請參閱@Sammaye的代碼段 – tymeJV

+0

您一次只能從一個集合中檢索文檔。因此,如果不重構您的文檔或集合,您無法在單個查詢中獲得它們。 – WiredPrairie

回答

3

MongoDB和SQL之間的一個區別是MongoDB中沒有JOIN s。在MongoDB中爲數據建模的首選方法是將文檔嵌入到彼此中,而不是將它們分開並通過ObjectId引用它們。

您目前的做事方式需要兩次前往數據庫,一次是獲取電視,另一次是獲取評論。除非您打算在不引用電視的地方引用評論(不太可能),否則您可以直接將評論放入電視文檔。現在,當您拉動電視文檔時,您會收到「免費」評論。

{ 
    "_id": ObjectId("123456abc"), 
    "brand": "Sony", 
    "model": "Bravia", 
    "price": 1000, 
    "comments": [ 
      { 
       "user": ObjectId("413212eop"), 
       "text": "Very nice TV" 
      } 
    ] 
} 

請注意,我將引用留給了用戶,而不是將其嵌入到電視文檔中。在某些情況下,您只需執行多個查詢即可獲取數據,因爲嵌入不是適當的關係。

這裏看到更多的信息:http://docs.mongodb.org/manual/core/data-modeling/

+0

我正在閱讀mongodb文檔,具體介紹了有關手工參考的內容,並說明如下內容: 手動引用指的是在另一個文檔中包含一個 文檔的_id字段的做法。然後,應用程序可以發出第二個查詢來根據需要解析引用的字段。 我不明白這個引用或DBRef的目標,它只給我一個參考,但它沒有給我提供我需要的信息。 我需要一個集合中的電視和另一個集合中的用戶,我不能在電視收藏中嵌入用戶信息(名稱,圖像...)。 – RMontes13

+1

如果您擁有高度關係數據,MongoDB可能不適合您。在這種情況下,您的應用程序需要查詢電視對象,然後獲取已評論的用戶列表,然後爲這些用戶進行第二次查詢。無法在一個查詢中恢復所有數據。 – Mason