MongoDB中的最佳解决方案体系结构

MongoDB中的最佳解决方案体系结构,mongodb,collections,architecture,Mongodb,Collections,Architecture,我使用的是MongoDB,我想多次显示一个包含类型和子类型的菜单,如果我访问一个子类型,系统会显示该子类型的产品 示例1对我来说更好,因为每种类型只有一个集合,但如果我不访问任何子类型,我也将加载所有产品。好的,我知道,我可以使用投影,但是可以使用投影和查询吗?我可以只投影一个子类型的产品吗?因此,在本例中,示例2可能是正确的方法,但我有两个集合和更多关系 你认为什么是最好的解决方案 示例1 收集类型: { "_id" : ObjectId("53fae88aafb3dc3494e03225")

我使用的是MongoDB,我想多次显示一个包含类型和子类型的菜单,如果我访问一个子类型,系统会显示该子类型的产品

示例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"
    } 
]
}

MongoDB中最好的解决方案是您展示的第一个解决方案,因为它是一个非关系数据库。关于你的问题,你不必担心,你可以问什么就做什么。你只需要知道怎么做。关于你的问题:

“好的,我知道,我可以使用投影,但是可以将投影与查询一起使用吗?我可以只投影一个子类型的产品吗?”

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

db.products.find( {“名称”:“类型名称”,“子类型.名称”:“子类型名称”},{“子类型.产品”:1})

这里的问题是,这将为您提供一个包含“TypeName”类型的所有子类型及其产品列表的列表。所以这是错误的

您需要使用来检索所需产品的列表:

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

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


在您公开的用例中,我认为这应该是解决方案。

前缀为
$
的字段是不允许的,因为它是MongoDB中用于其他目的的保留字符。是的,它是由Morphia生成的代码,而不是我的。