MongoDB中最好的解决方案架构

时间:2015-01-09 09:32:01

标签: mongodb collections architecture

我正在使用MongoDB,我希望多次显示带有Type和Subtypes菜单的数据,如果我访问一个子类型,系统会显示子类型的产品。

示例1对我来说更好,因为我每种类型只有一个集合,但如果我不访问任何子类型,我也会加载所有产品。好的我知道,我可以使用投影,但是可以使用带有查询的投影吗?我可以只投射一个子类型的产品吗?因此,在这种情况下,示例2可能是正确的方法,但我有两个集合和更多关系。

您认为最佳解决方案是什么?

示例1

收集类型:

{
"_id" : ObjectId("53fae88aafb3dc3494e03225"),
"name" : "TypeProduct",
"subtypes" : [ 
{
    "name" : "Subtype1",
    "products" : [ 
    {
                "$ref" : "products",
                "$id" : ObjectId("53fee4fcafb358a62d7684c3"),
            "sku" : "0001",
        "picture" : "http...jpg"
            }, 
            {
                "$ref" : "products",
                "$id" : ObjectId("53fee656afb358a62d7684c4"),
            "sku" : "0002",
        "picture" : "http...jpg"
            } 
    ]
}, 
{
    "name" : "Subtype2",
    "products" : [ 
    {
                "$ref" : "products",
                "$id" : ObjectId("53fee4fcafb358a62d7684c3"),
            "sku" : "0001",
        "picture" : "http...jpg"
            }, 
            {
                "$ref" : "products",
                "$id" : ObjectId("53fee656afb358a62d7684c4"),
            "sku" : "0003",
        "picture" : "http...jpg"
            } 
    ]
}
]
}

示例2

收集类型

{
"_id" : ObjectId("53fae88aafb3dc3494e03225"),
"name" : "TypeProduct",
"subtypes" : [ 
{
        "$ref" : "subtypes",
        "$id" : ObjectId("53fee4fcafb358a62d7684c3"),
    "name" : "Subtype1"
}, 
{
        "$ref" : "subtypes",
        "$id" : ObjectId("53fee4fcafb358a62d7684c3"),
    "name" : "Subtype2"
}
]
}

收集子类型

{
"_id" : ObjectId("53fee4fcafb358a62d7684c3"),
"name" : "Subtype1",
"products" : [ 
{
        "$ref" : "products",
        "$id" : ObjectId("53fee4fcafb358a62d7684c3"),
        "sku" : "0001",
    "picture" : "http...jpg"
    }, 
    {
        "$ref" : "products",
        "$id" : ObjectId("53fee656afb358a62d7684c4"),
        "sku" : "0002",
    "picture" : "http...jpg"
    } 
]
}

1 个答案:

答案 0 :(得分:0)

MongoDB中的最佳解决方案是您展示的第一个解决方案,因为它是非关系型数据库。关于你的问题,你不必担心,你可以做你要求的一切。你只需要知道如何做到这一点。关于你的问题:

"我知道,我可以使用投影,但是是否可以在查询中使用投影?我可以只投射一个子类型的产品吗?"

是的,但不是正常的方式。您可以尝试的一种解决方案是过滤子类型,然后仅投影产品,如下所示:

db.products.find( {" name":" TypeName"," subtypes.name":" SubtypeName"},{" subtypes.products&#34 ;:1})

这里的问题是,这将为您提供一个包含" TypeName"类型的所有子类型的列表。和他们的产品清单。所以这是错误的

您需要使用$elemMatch in the project来检索所需的产品列表:

db.products.find({" name":" TypeName"," subtypes.name":" SubtypeName" },{" subtypes":{$ elemMatch:{" name":" SubtypeName"}}," subtypes.products":1} )

请注意,$ elemMatch用于限制查询结果中的数组字段,仅返回匹配的第一个元素

在你暴露的用例中我认为这应该是解决方案。