例如:如果我有一个名为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 ]
}
答案 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来衡量效果。