2016-02-26 29 views
1

对于first pattern example of Mongodb Model One-to-Many Relationships with Document References -MongoDB的多键指数 - 稀疏,独特,和成长问题

我有创造的book阵列领域的多键索引发行商O'Reilly Media一些问题:

为了便于学习,我要在将来假装这本书阵列将仅由5个元素增长最多所以我想只注重使用数组这种模式

  1. 当我添加一个objectId到book数组时,它会自动索引新的元素吗?

  2. 当我创建db.publishers.createIndex(books),做我想要做 背景真实,所以当我后来添加到书籍 阵列的道路也不会阻止它索引的新的价值?

  3. 我看到unique默认值为false。我很困惑 这是因为我不知道MongoDb索引的内部工作原理。 books数组上的唯一值是否必须为真?
  4. 对于sparse,我为什么要使用它,为什么它设置为false? books数组已经是指定的字段。
  5. 如果我删除了数组中的一个元素,索引 的大小是否会自动减小?
  6. 我假设如果我稍后修改书本文档,它不会影响 写入性能,因为它的objectId已经索引在 之前,发行者的书籍数组正确吗?

    { 
        name: "O'Reilly Media", 
        founded: 1980, 
        location: "CA", 
        books: [12346789, 234567890, ...] 
    } 
    
    { 
        _id: 123456789, 
        title: "MongoDB: The Definitive Guide", 
        author: [ "Kristina Chodorow", "Mike Dirolf" ], 
        published_date: ISODate("2010-09-24"), 
        pages: 216, 
        language: "English" 
    } 
    

回答

1
  1. 的MongoDB会自动将书本ID添加到多键索引。但是,该索引当然不包括实际的书籍文档。
  2. 该块只在创建索引时发生,而不是在添加项目时(尽管将新项目放入索引中的开销很小)。想象一下,你已经有10万本书出版了每本200K本书 - 索引这些只需要一段时间,或者阻止任何操作,因此速度更快,我们在后台进行。
  3. null值也是唯一值。所以,如果没有出版的书,你就不可能有两个出版商。
  4. 稀疏指数被用来保存珍贵的RAM。如果你有几百万份文件只有一小部分有特定的字段,那么只需浪费RAM即可获得几百万个条目。目前,部分指数是首选,它提供了与稀疏诱导相同的功能,然后提供一些指标。
  5. 是的,由您删除的值。如果数组由于删除而被清空,并且您使用了稀疏或部分索引,则对该文档的相应引用也将被删除。
  6. 完全错误。一个索引被严格简化,只不过索引的字段的寄存器和相应文档在数据文件中的位置。对于books数组,这将是包含索引值的发布者文档。同样,它不是获取索引的书籍文档,而是持有参考书籍文档的字段。为什么书场被编入索引的原因是,对于书,出版商可以发现速度快:

    db.publishers.find({books:someBookId}) 
    

    当编辑的书籍文件,你仍然必须先找到它,并应用更改其最终需要同步到磁盘(甚至是之前的日志)。索引不会奇迹般地消除对持久数据的需求。