2012-12-16 53 views
2

我有這樣的事情:獨特而稀疏索引會導致重複錯誤

var mongoose = require('mongoose'); 

mongoose.connect('mongodb://...'); 

var UserSchema = mongoose.Schema({ 
    name: { 
    type: String, 
    unique: true 
    }, 
    token: { 
    type: String, 
    unique: true, 
    sparse: true 
    } 
}); 

var User = mongoose.model('User', UserSchema); 

var peter = new User(); 

peter.name = 'peter'; 
peter.token = null; 

peter.save(function(err) { 
    if (err) console.log(err); 
    console.log('done with peter'); 

    var john = new User(); 

    john.name = 'john'; 
    john.token = null; 

    john.save(function(err) { 
    if (err) console.log(err); 
    console.log('done with john'); 
    }); 

}); 

所以peter首先事後john創建。然而,當john保存mongoose返回以下錯誤

{ [MongoError: E11000 duplicate key error index: node-login.users.$token_1 dup key: { : null }] 
    name: 'MongoError', 
    err: 'E11000 duplicate key error index: node-login.users.$token_1 dup key: { : null }', 
    code: 11000, 
    n: 0, 
    lastOp: 0, 
    connectionId: 4527333, 
    ok: 1 } 

代碼試圖在mongolab運行mongo v2.0.7mongoose v3.5.1

我以爲設置索引sparse允許多個null值。索引被正確設置爲mongolab後端的「索引」選項卡true對於uniquesparse。任何想法,爲什麼我得到錯誤?

回答

5

A sparse index只索引字段,如果一個文件那個字段。無論該字段設置爲null還是其他一些值都無關緊要,它仍會檢查是否存在唯一性。

因此,在您的情況下,請忽略設置token字段,而不是將其設置爲null

+0

我需要用戶註冊了'token'。用戶註冊併發送帶有令牌的電子郵件。用戶點擊帶有令牌的鏈接。我的應用程序查看令牌並驗證它。驗證後,我想將標記設置爲「null」。所以最後我會有多個用戶使用獨特的令牌和多個使用'null'令牌的用戶。你會如何解決這個問題? – zemirco

+1

如果您想保留唯一的稀疏索引,請不要將'token'設置爲'null',['$ unset'](http://docs.mongodb.org/manual/reference/operators/#_S_unset)它而是將其刪除。 – JohnnyHK

2

在JavaScript中,將值設置爲null不會刪除該屬性,而是將值設置爲null。在你的情況下,你應該刪除令牌屬性。

delete john.token; // In place of John.token = null 

對彼得做同樣的事情。

參見更多刪除:Remove a property from a JavaScript object