【问题标题】:Multi collection filter in mongodb in nodemongodb节点中的多集合过滤器
【发布时间】:2016-02-25 12:15:23
【问题描述】:

我有 3 个不同的集合 RecipeCategoryCuisines

他们之间的关系

每个Recipe(n) (n) Category 每个菜谱可以有很多 Category 每个类别也可以有很多菜谱。

每个Recipe (n) (n) Cuisines 每个菜谱可以有很多菜谱,每个菜谱也可以有很多菜谱。

Recipe集合模型示例披萨、汉堡

Category集合模型示例午餐、晚餐

Cuisines 集合模型示例意大利语、墨西哥语

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

谁的集合namelunch

另外,应该只属于美食名称ItalianMexican

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

我不能使用非规范化,也不能在同一个 recipe 文档中包含 categorycuisines,因为每个美食和类别类型都必须是唯一的,而且每个都有 many to manyRecipe 的关系,因此为此非规范化条件不太适合这里。

我正在为 Mongo 使用 loopback-datasource-juggler orm

这会创建一个单独的表来处理many to many relationship 结构。

Recipe

{
   RECIPE_ID,
   RECIPE_NAME,
   ....
   ....
}

Category

{
  CATEGORY_ID,
  CATEGORY_NAME
}

//连接Recipe和Category模型

RecipeCategory

{
  RECIPE_ID
  CATEGORY_ID
}

Cuisines

{
  CUISINES_ID,
  CUISINES_NAME
}

//连接RecipeCuisines模型

RecipeCuisines

{
  RECIPE_ID
  CUISINES_ID
}

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

现在我应该如何执行过滤查询,只查找那些Recipename 是披萨,其集合namelunch 并且应该只属于美食名称@987654361 @ 或 Mexican 使用 mongoDb?

【问题讨论】:

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


    【解决方案1】:

    您可以使用嵌入文档来解决这个问题。

    配方集合(假设 categorycuisines 字段应该很小)

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

    查询

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

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

    【讨论】:

    • 感谢您的回答,但正如我在问题中所说,在这种情况下嵌入是不可能的。类别和美食是唯一的字段,应该是不同的,并且使用第三个连接表与多对多关系连接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    相关资源
    最近更新 更多