0

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

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

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

一个产品文档是这样的:

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!",
}

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

谢谢大家。

4

1 回答 1

3

category['id']该查询正在产品集合中搜索字段中值为 的所有产品category_ids

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

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

您还必须注意,该product集合有一个存储类别 ID 列表的字段category_ids,它引用该category集合的唯一 ID。

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

如果我要为基于 Mongo javascript 的 shell 解释器编写查询,mongo在 Gardening Tools 类别中查找产品,我会执行以下操作:

  1. 查找 Gardening Tools 类别的 ID(如前所述,该 ID 存储在集合 的_id字段中)category
    • 在这种情况下,您的示例中的值为ObjectId("6a5b1476238d3b4dd5000048")
  2. 将值插入到通过集合 category_ids字段进行搜索的查询中product
    • 这是您在问题中给出的查询,对于mongoshell,我将其写为:db.products.find({category_ids : new ObjectId("6a5b1476238d3b4dd5000048")})

我希望这比原来的解释更清楚!

(顺便说一句:我不太确定您的查询是用什么语言编写的,可能是 PHP 吗?无论如何,javascript 似乎是 MongoDB 文档中示例的首选语言,因为 MongoDB 服务器安装了mongo命令行解释器旁边的服务器本身,所以每个人都可以访问它)

于 2012-05-28T21:48:59.623 回答