我正在阅读MongoDB in Action,当谈到在文档中查询多对多关系时,我很难理解他是如何编写示例查询的(使用Ruby驱动程序)。
查询是查找特定类别中的所有产品,其中有products
和category
集合。作者说:"要查询园艺工具类别中的所有产品,代码很简单:
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"],
}
类别文档是这样的:
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!",
}
有人可以向我解释一下吗?我仍然不明白他是怎么写这个查询的:(
谢谢大家。
正在产品集合中搜索字段 category_ids
中
category['id']
的所有产品当您在包含数组的字段中搜索特定值时,MongoDB会自动枚举该数组中的每个值以搜索匹配项。
要构造查询,您必须首先注意到 category
集合定义了您的类别层次结构,并且每个类别都有一个唯一的 ID(像 MongoDB 中通常一样存储在 _id
字段中)
您还必须注意,product
集合有一个字段,该字段存储类别 ID 列表,category_ids
引用category
集合的唯一 ID。
因此,若要查找特定类别中的所有产品,请在product
集合的category_ids
字段中搜索您感兴趣的类别的唯一 ID,该 ID 是从category
集合中获取的。
如果我要为基于 Mongo javascript 的 shell 解释器编写查询,mongo
在园艺工具类别中查找产品,我会执行以下操作:
- 查找园艺工具类别的 ID(如前所述,该 ID 存储在
category
集合的_id
字段中)- 在本例中,示例中的值为
ObjectId("6a5b1476238d3b4dd5000048")
- 在本例中,示例中的值为
- 将值插入到搜索
product
集合的category_ids
字段的查询中- 这是您在问题中给出的查询,对于
mongo
外壳,我会写为:db.products.find({category_ids : new ObjectId("6a5b1476238d3b4dd5000048")})
- 这是您在问题中给出的查询,对于
我希望这比原来的解释更清楚!
(顺便说一句:我不太确定你的查询是用什么语言编写的,也许是PHP吗?无论如何,javascript似乎是MongoDB文档中示例的首选语言,因为MongoDB服务器在服务器本身旁边安装了mongo
命令行解释器,因此每个人都可以访问它)