节点

时间:2016-02-25 12:15:23

标签: node.js mongodb mongodb-query loopbackjs strongloop

我有3个不同的集合RecipeCategoryCuisines

  

他们之间的关系

每个Recipe(n)< =======> (n)Category每个食谱可以有很多Category,每个类别也可以有很多食谱。

每个Recipe(n)< ======> (n)Cuisines每种食谱都可以有很多美食,每种菜肴都可以有很多食谱。

Recipe收集模型示例披萨,汉堡

Category收集模型示例午餐,晚餐

Cuisines收集模型示例意大利语,墨西哥

现在我想只找到那些Recipe是披萨和

name

其收藏集namelunch

此外,应仅属于菜单名称ItalianMexican

考虑到性能不应影响性能,执行过滤查询的最佳方法是什么?

我不能使用非规范化,并且不能在同一category文档中包含cuisinesrecipe,因为每个菜单和类别类型必须是唯一的,每个都有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
}

//连接RecipeCuisines型号

RecipeCuisines

{
  RECIPE_ID
  CUISINES_ID
}

如果many to many关系,node.js的loopback-datasource-juggler如何创建模型。

现在我应该如何执行过滤查询,该过滤查询只会查找Recipe为披萨并且其集合namename的{​​{1}}个{}仅使用mongoDb属于菜单名lunchItalian

1 个答案:

答案 0 :(得分:0)

您可以使用嵌入式文档来解决此问题。

食谱集合(假设categorycuisines字段应该很小)

{
   _id: xx
   name: "pizza",
   category: ["lunch", "dinner"],
   cuisines: ["italian", "mexican"]
}

查询

db.recipe.find({name: "pizza", category: "lunch", cusisines: "mexican"})

您还可以创建适当的索引来加速查询。