mongoDB有多个查询?

时间:2010-05-25 21:41:44

标签: mongodb

在mysql中我使用JOIN并且一个查询没问题。那个mongo呢?

想象类别和产品。

产品可能有更多类别。 类别可能有更多的产品。 (多对多结构) 管理员可以在管理中编辑类别(类别必须分开)

它可能在一个查询中写入带有类别名称的产品吗?

我使用了这个结构

categories {
   name:"categoryName",
         product_id:["4b5783300334000000000aa9","5783300334000000000aa943","6c6793300334001000000006"]
}


products  {
    name:"productName",
category_id:["4b5783300334000000000bb9","5783300334000000000bb943","6c6793300334001000000116"]
}

现在,我可以简单地获取所有产品类别,以及某些类别和类别中的产品进行编辑。但如果我想要用类别名称编写产品,我需要两个查询 - 一个用于获取产品类别ID,第二个用于按类别从类别中获取类别名称。

这是正确的方法吗?或者这种结构不合适?我想只有一个查询,但我不知道它是否可能。

2 个答案:

答案 0 :(得分:5)

是的,MongoDB在这种特殊类型的操作中特别糟糕。但是,这也是一个范围问题。如果您有3000万个产品并且想要将300万个产品加入到他们的类别中,您会发现它在许多数据库中都不是很快(即使它是一行代码)。

MongoDB在这里要求的是一些去规范化。

您的收藏可能如下所示:

categories {
  _id:"mongoid",
  name:"categoryName",
  ...
}

products  {
  _id:"mongoid",
  name:"productName",
  categories:[
    {"4b5783300334000000000bb9":'categoryName'},
    {"5783300334000000000bb943":'CategoryName2'},
    {"6c6793300334001000000116":'categoryName3'}
  ]
}

这是如何工作的(粗略估计,没有我的Mongo实例方便):

抓取产品及其类别

db.products.find({"_id": {$in:[1,2,3]}, {name:1,categories:1})

获取特定类别的产品:

db.products.find({"categories.0": {$in:[x,y,z]}},{categories:1,name:1} }

是的,它不太一样。当您更改类别名称时,您必须更新所有产品记录。我知道这看起来很奇怪,但这是非规范化的标准。

顺便说一句,我在这里假设您将拥有大量产品并且明显减少类别。如果你在每个类别中说100个项目,这种方法可能是最好的。如果每个类别中有5个项目,那么您可能希望在每个项目中存储更多类别信息。

答案 1 :(得分:1)

是的,这是你唯一的方式。没有加入的可能性。

但您可以在类别或产品文档中添加大量信息,例如:

categories {
   name:"categoryName",
         product_id:[ {"4b5783300334000000000aa9": 'productName'},{"5783300334000000000aa943":'productName2'},{"6c6793300334001000000006":'productName3'}]
}


products  {
    name:"productName",
category_id:[{"4b5783300334000000000bb9":'categoryName'},{"5783300334000000000bb943":'CategoryName2',{"6c6793300334001000000116":'categoryName3'}]
}

但是你需要在更改时更新所有文档时进行一些回调。