在另一个Collection Mongodb中的Subdocument中引用_id

时间:2014-02-19 10:40:06

标签: mongodb database-design

我正在使用mongodb和nodejs开发一个应用程序 我还要提一下,我是两个新手,所以请帮我解决这个问题

我的数据库有一个集合类别,然后在每个类别中我将产品存储在子文档中 如下所示:

   {
    _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中使用_id来查询产品的描述?

或者我们的设计和实施是错误的,我必须从头开始重新设计并将产品从类别分成另一个系列?

请不要将链接放到通常会讨论mongodb及其馆藏实施的网站或博客上,除非他们专注于与我非常相似的问题

提前致谢

1 个答案:

答案 0 :(得分: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 })