【问题标题】:Reference an _id in a Subdocument in another Collection Mongodb在另一个集合 Mongodb 的子文档中引用 _id
【发布时间】:2014-03-19 15:17:49
【问题描述】:

我正在使用 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 及其集合实现的网站或博客,除非他们关注与我非常相似的问题

提前致谢

【问题讨论】:

    标签: mongodb database-design


    【解决方案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 })
    

    【讨论】:

    • 我认为我的问题已经足够清楚,并提供了足够的细节,实际上我的数据库中没有产品集合,.. 有一个类别,它有一个存储产品的子文档,因为我Mongodb 的新手我正在寻找最快的查询和最优化的查询,它仅通过 product _id 获取 product.description
    • 抱歉,我在心里把它翻译成了一个工作结构。我添加了更多详细信息,解释了为什么您提议的结构不能满足您的要求。
    • 感谢您更新答案,因此您的建议是避免嵌套元素不止一步
    • 是和不是。这取决于产品是否可以属于多个类别。然后,我希望它们分开存储。
    猜你喜欢
    • 2017-05-06
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2023-01-10
    相关资源
    最近更新 更多