必須在生產中更改架構
我有一個平均堆棧網站
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}
任何在唯一索引中缺少該欄位的文件都將具有
null
indexed 值。除非該索引配置為稀疏索引或部分索引,否則同一集合中的兩個文件不能缺少唯一索引中的欄位 。
mongo
您可以使用shell 或管理工具手動刪除有問題的索引。例如:db.getSiblingDB('news').users.dropIndex({username:1})
另外,我備份了以前的生產數據庫,並複製到開發,並恢復它。奇怪的是,與生產不同,創建兩個新使用者並沒有在開發中出錯。
結果的差異將取決於目標數據庫是否具有先前創建的唯一索引。