我有3个不同的集合Recipe
,Category
和Cuisines
。
他们之间的关系
每个Recipe
(n)< =======> (n)Category
每个食谱可以有很多Category
,每个类别也可以有很多食谱。
每个Recipe
(n)< ======> (n)Cuisines
每种食谱都可以有很多美食,每种菜肴都可以有很多食谱。
Recipe
收集模型示例披萨,汉堡
Category
收集模型示例午餐,晚餐
Cuisines
收集模型示例意大利语,墨西哥
现在我想只找到那些Recipe
是披萨和
name
其收藏集name
为lunch
和
此外,应仅属于菜单名称Italian
或Mexican
。
考虑到性能不应影响性能,执行过滤查询的最佳方法是什么?
我不能使用非规范化,并且不能在同一category
文档中包含cuisines
和recipe
,因为每个菜单和类别类型必须是唯一的,每个都有many to many
个关系使用Recipe
因此对这种情况进行非正规化并不适合这里。
我正在使用Mongback的loopback-datasource-juggler orm
创建一个单独的表处理many to many relationship
结构。
Recipe
{
RECIPE_ID,
RECIPE_NAME,
....
....
}
Category
{
CATEGORY_ID,
CATEGORY_NAME
}
//连接配方和类别模型
RecipeCategory
{
RECIPE_ID
CATEGORY_ID
}
Cuisines
{
CUISINES_ID,
CUISINES_NAME
}
//连接Recipe
和Cuisines
型号
RecipeCuisines
{
RECIPE_ID
CUISINES_ID
}
如果many to many
关系,node.js的loopback-datasource-juggler如何创建模型。
现在我应该如何执行过滤查询,该过滤查询只会查找Recipe
为披萨并且其集合name
为name
的{{1}}个{}仅使用mongoDb属于菜单名lunch
或Italian
?
答案 0 :(得分:0)
您可以使用嵌入式文档来解决此问题。
食谱集合(假设category
和cuisines
字段应该很小)
{
_id: xx
name: "pizza",
category: ["lunch", "dinner"],
cuisines: ["italian", "mexican"]
}
查询
db.recipe.find({name: "pizza", category: "lunch", cusisines: "mexican"})
您还可以创建适当的索引来加速查询。