2014-02-19 116 views
0

我開發與MongoDB的應用程序和的NodeJS 我還要提到,我是新來的都那麼請幫助我通過這個問題參考子文檔的_id在另一個集合的MongoDB

我的數據庫有一個收藏門類然後在每個類別中,我將產品存放在子文檔 就像如下:

{ 
    _id : ObjectId(), 
    name: String, 
    type: String,   
    products : [{ 
     _id : ObjectId(), 
     name : String, 
     description : String, 
     price : String 
    }] 
}); 

當涉及到存儲在訂單數據庫中收集的訂單將是這樣的:

{ 
    receiver : String, 
    status : String, 
    subOrders : [ 
     { 
      products :[{ 
       productId : String, 
       name : String, 
       price : String, 
       status : String 
      }], 

      tax : String,    
      total : String, 
      status : String, 
      orderNote : String 
     } 
    ] 
} 

正如你所看到的,我們正在存儲_id產品,它是 中的類別的子文檔,當存儲時顯然沒有問題,當涉及到獲取這些數據時,如果我們只需要有限的字段,如名稱或價格那裏也沒有問題,但如果以後我們需要一些額外的領域像產品描述,...他們不存儲在訂單。

我的問題是這樣的: 是否有任何簡單的方法來訪問除mongodb中的整個類別的循環之外的其他產品領域,即我需要一個示例代碼來查詢產品的描述, MongoDB的?

或者我們的設計和實現是錯誤的,我必須從頭開始重新設計它,並將產品從類別中分離到另一個集合中?

請不要把網站鏈接或一般談論MongoDB的博客和其收藏的實現,除非他們集中在一個非常類似的問題,提前挖掘

感謝

回答

1

我會假設你想要返回與當前產品列表相匹配的產品描述,因此首先,不存在僅返回匹配的數組元素的查詢。使用$elemMatch可以返回特定元素或第一個匹配項,但不僅可以匹配數組元素。但是,$elemMatch也可以用作投影操作符。

db.categories({ "products._id" : "PID1" }, 
       { $elemMatch : { "products._id" : "PID1" }, 
       "products._id" : 1, 
       "products.description" : 1}) 

你肯定會想索引"products._id"領域實現合理的性能。

您可能會考慮創建一個產品集合,其中每個文檔都包含一個類別標識符,就像在關係數據庫中一樣。這是MongoDb中一種常見的模式,當嵌入沒有意義時,或使查詢和聚合複雜化。

假設是正確的:

你需要手動從第二集合加載數據。 MognoDb中沒有加入。您可能會考慮使用$in,它爲某個字段提供一個值列表並加載所有匹配的文檔。

根據您用來訪問MongoDb的驅動程序,您應該可以使用find的投影功能,該功能可以將文檔返回的字段限制爲您指定的字段。由於產品描述可能經常發生變化,因此您也可以考慮在客戶端緩存一段時間的值(例如Web服務器)。

db.products.find({ _id: { $in : [ 'PID1', 'PID2'] } }, { description : 1 }) 
+0

我想我是在我的問題不夠清楚,提供足夠的細節居然沒有任何的產品收集我的數據庫,.. 有一個類別,它具有存儲產品的一個子文檔,因爲我是新到Mongodb我正在尋找最快的查詢和最優化的一個只通過產品獲取product.description _id – Siavosh

+0

對不起,我已經將它精神轉化爲一個工作結構。我已經添加了一些更多的細節,解釋爲什麼您的建議結構不適合您的要求。 – WiredPrairie

+0

感謝您更新答案,所以您的建議是避免多個步驟嵌套元素 – Siavosh

相關問題