【问题标题】:The best solution architecture in MongoDBMongoDB中最好的解决方案架构
【发布时间】:2015-01-09 09:32:01
【问题描述】:

我正在使用 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 中用于其他用途的保留字符。
  • 是的,它是 Morphia 生成的代码,不是我的。

标签: mongodb collections architecture


【解决方案1】:

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

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多