【问题标题】:Query a Many-to-Many relation in MongoDB在 MongoDB 中查询多对多关系
【发布时间】:2012-05-28 21:17:02
【问题描述】:

我正在阅读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!",
}

有人可以向我解释一下吗?我还是不明白他是怎么写那个查询的:(

谢谢大家。

【问题讨论】:

    标签: mongodb mongodb-query mongodb-ruby


    【解决方案1】:

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 感谢您的详细解释。 Mongodb in Action 这本书正在使用 Ruby 代码来编写这样的语言示例。
    • 所以在他的例子中'id'有特殊含义,必须按原样传递?这就是我感到困惑的地方。
    • 看不到这本书,看起来category_id 可能是一个数组/变量,作者已经填写了他们想要的类别的ID(上面我的答案中的步骤1)。我不懂 Ruby,所以很难知道如何解释代码。感谢您的接受:)
    猜你喜欢
    • 2022-12-23
    • 1970-01-01
    • 2013-09-29
    • 2015-05-24
    • 2021-03-07
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多