mongodb索引如何列出

时间:2013-09-03 19:38:55

标签: mongodb indexing

例如:如果我有一个名为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 ]
}

2 个答案:

答案 0 :(得分:1)

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

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

为了获得商品数量,您只能得到一个文件的商品字段大小,如db.store.find()[index] .merchandise.length。因此,如果您想根据商品尺寸运行查询,那么在商品大小和索引上创建单独的字段是一个可行的选择。

希望这有帮助

答案 1 :(得分:1)

如果索引包含数组的字段,MongoDB会在multikey index中单独索引数组中的每个值。如果数组中有4个文档,则每个文档都将作为索引中的键,指向上述文档

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

Read more about Multikey Indexes

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

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

请记住,索引会减慢写入速度,因为它们也需要更新。我会在我的查询中考虑explain来衡量效果。