2016-02-26 35 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}) 
    

    當編輯的書籍文件,你仍然必須先找到它,並應用更改其最終需要同步到磁盤(甚至是之前的日誌)。索引不會奇蹟般地消除對持久數據的需求。