查询MongoDB中的多对多关系

时间:2012-05-28 21:17:03

标签: mongodb mongodb-query mongodb-ruby

我正在阅读MongoDB in Action,当谈到在文档中查询多对多关系时,我很难理解他如何编写他的示例查询(使用Ruby驱动程序)。

查询正在查找特定类别中的所有产品,其中包含productscategory集合。作者说:“要查询园艺工具类别中的所有产品,代码很简单:

db.products.find({category_ids => category['id']})

PRODUCT文档是这样的:

doc =
{ _id: new ObjectId("4c4b1476238d3b4dd5003981"),
  slug: "wheel-barrow-9092",
  sku: "9092",
  name: "Extra Large Wheel Barrow",
  description: "Heavy duty wheel barrow...",

  details: {
    weight: 47,
    weight_units: "lbs",
    model_num: 4039283402,
    manufacturer: "Acme",
    color: "Green"
  },

  category_ids: [new ObjectId("6a5b1476238d3b4dd5000048"),
                    new ObjectId("6a5b1476238d3b4dd5000049")],

  main_cat_id: new ObjectId("6a5b1476238d3b4dd5000048"),

  tags: ["tools", "gardening", "soil"],

}

CATEGORY文档是这样的:

doc =
{  _id: new ObjectId("6a5b1476238d3b4dd5000048"),
   slug: "gardening-tools",
   ancestors: [{ name: "Home",
                 _id: new ObjectId("8b87fb1476238d3b4dd500003"),
                 slug: "home"
                },

                { name: "Outdoors",
                 _id:  new ObjectId("9a9fb1476238d3b4dd5000001"),
                 slug: "outdoors"
               }
   ],

   parent_id: new ObjectId("9a9fb1476238d3b4dd5000001"),

   name: "Gardening Tools",
   description: "Gardening gadgets galore!",
}

有人可以向我解释一下吗?我仍然无法理解他是如何编写该查询的:(

谢谢大家。

1 个答案:

答案 0 :(得分:3)

该查询正在产品系列中搜索字段category['id']

中值为category_ids的所有商品

当您搜索包含特定值数组的字段时,MongoDB会自动枚举该数组中搜索匹配项的每个值。

要构造查询,您必须首先注意到category集合定义了您的类别层次结构,并且每个类别都有一个唯一的ID(在_id字段中存储,如MongoDB中常见的那样)

您还必须注意到product集合中有一个字段,其中存储了类别ID列表category_ids,这些列表引用了category集合的唯一ID。

因此,要查找特定类别中的所有产品,请在category_ids集合的product字段中搜索您感兴趣的类别的唯一ID,您可以从{ {1}}收集。

如果我要编写一个基于Mongo javascript的shell解释器category的查询,它在园艺工具类别中找到产品,我会执行以下操作:

  1. 查找“园艺工具”类别的ID(如前所述,该类别存储在mongo集合的_id字段中)
    • 在这种情况下,示例中的值为category
  2. 将值插入到搜索ObjectId("6a5b1476238d3b4dd5000048")集合的category_ids字段的查询中
    • 这是您在问题中提供的查询,对于product shell,我将其写为:mongo
  3. 我希望这比原来的解释更清楚!

    (顺便说一下:我不太确定你的查询是用什么语言编写的,它可能是PHP吗?在任何情况下,javascript似乎都是MongoDB文档中的例子的首选语言,因为MongoDB服务器安装了db.products.find({category_ids : new ObjectId("6a5b1476238d3b4dd5000048")})命令行解释器与服务器本身一起,所以每个人都可以访问它)