Mongodb

必須在生產中更改架構

  • November 24, 2017

我有一個平均堆棧網站www.myweb.io。我需要升級程式碼和數據庫。在之前的數據庫中,我有一個架構:

var UserSchema = new mongoose.Schema({
   username: {type: String, lowercse: true, unique: true},
   ...
})

我決定改變很多UserSchema,尤其是刪除username

我剛剛將程式碼從 dev 上傳到 prod。添加第一個使用者效果很好,而添加另一個使用者給了我:

events.js:182
     throw er; // Unhandled 'error' event
     ^
MongoError: insertDocument :: caused by :: 11000 E11000 duplicate key error index: news.users.$username_1  dup key: { : null }
   at Function.MongoError.create (/opt/funfun/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/lib/error.js:31:11)

我想這是因為這兩個新使用者都沒有username. 但是為什麼系統還記得username是key呢?在 MongoDB 中,我們不必更改模式,對嗎?

另外,我備份了以前的生產數據庫,並複製到開發,並恢復它。奇怪的是,與生產不同,創建兩個新使用者並沒有在開發中出錯。

有誰知道我是否必須在生產中更改架構?如何?

在 MongoDB 中,我們不必更改模式,對嗎?

MongoDB 不要求您預先聲明模式,但管理員仍有一些責任來刪除不需要的索引或數據約束。您使用的 Mongoose Node.js 框架包含一個聲明性客戶端模式,但 MongoDB 伺服器不知道欄位或索引使用的任何更改。

預設情況下,Mongoose 在啟動時創建新索引(取決於config.autoIndex您的架構選項),但一旦創建,就沒有任何跟踪來刪除或更改索引定義。由於您之前在 上創建了唯一索引username,因此如果您不再需要該約束,則需要手動刪除該索引。

重複鍵錯誤消息指示索引名稱和違規鍵值:

E11000 重複鍵錯誤索引:news.users.$username_1 重複鍵:{:null}

任何在唯一索引中缺少該欄位的文件都將具有nullindexed 值。除非該索引配置為稀疏索引或部分索引,否則同一集合中的兩個文件不能缺少唯一索引中的欄位 。

mongo您可以使用shell 或管理工具手動刪除有問題的索引。例如: db.getSiblingDB('news').users.dropIndex({username:1})

另外,我備份了以前的生產數據庫,並複製到開發,並恢復它。奇怪的是,與生產不同,創建兩個新使用者並沒有在開發中出錯。

結果的差異將取決於目標數據庫是否具有先前創建的唯一索引。

引用自:https://dba.stackexchange.com/questions/191627