我正在使用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"
}
]
}
答案 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用于限制查询结果中的数组字段,仅返回匹配的第一个元素。
在你暴露的用例中我认为这应该是解决方案。