0

例如:如果我有一个名为 Stores 的数据库集合,并且每个商店文档都有一个他们出售的商品的列表,并且商店通常共享商品,那么 mongodb 将如何在其上建立索引?它会在所有可能的项目上建立一个 btree 索引,然后在该树的每个叶子(每个项目)上将引用包含它的文档吗?

背景:我正在尝试使用索引执行这样的查询:

db.store.find({merchandise:{$exists:true}}) // where 'merchandise' is a list
db.store.find()[merchandise].count()

“商品”索引对我有帮助吗?如果不是,我唯一的选择是在“商品”大小上创建一个单独的元字段,并为其编制索引吗?

架构:

{ _id: 123456,
  name: Macys
  merchandise: [ 248651234564, 54862101248, 12450184, 1256001456 ]
}
4

2 回答 2

1

从您的文档示例中,如果您在商品上构建索引,它将是多键索引,并且该索引将位于数组中的每个项目上。请参阅此处的多键索引部分。

如果商品是子文档数组,则对商品进行索引会将索引放在数组中子文档的所有字段上。使用索引,您可以进行 db.store.find("merchandise":248651234564) 之类的查询,它将检索所有具有商品 248651234564 的文档

要获取商品数量,您只能获取 db.store.find()[index].merchandise.length 等文档的商品字段大小。因此,如果您想根据商品大小运行查询,则在商品大小和索引上创建单独的字段是一个可行的选择。

希望这可以帮助

于 2013-09-03T21:02:15.013 回答
1

如果索引包含数组的字段,MongoDB 会分别索引数组中的每个值,在multikey index. 当数组中有 4 个文档时,每个文档都将充当索引中的一个键并指向提到的文档

您可以使用多键索引来索引嵌入在数组中的对象中的字段。这意味着,在您的数组中,您可以索引每个文档中的特定字段。例如:stuffs.thing : 1

阅读有关多键索引的更多信息

您是否需要这些索引取决于:

  • 有多少查询依赖于该特定字段?
  • 有多少更新,插入命中该特定字段(数组)?
  • 该数组将包含多少项?
  • ...

请记住,索引会减慢写入速度,因为它们也需要更新。我会考虑对我的查询进行解释以衡量性能。

于 2013-09-03T21:09:00.050 回答