我有这样的事情:
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 }
会返回以下错误
mongo v2.0.7
代码尝试mongolab正在运行mongoose v3.5.1
和sparse
。
我认为设置null
的索引允许多个true
值。正确设置索引,因为mongolab后端的“索引”标签显示unique
和sparse
的{{1}}。我有什么想法可以得到错误吗?
答案 0 :(得分:5)
如果文档具有该字段,则sparse index仅对该字段编制索引。无论字段设置为null
还是某个其他值都无关紧要,如果存在,仍会检查其唯一性。
因此,在您的情况下,请忽略设置token
字段,而不是将其设置为null
。
答案 1 :(得分:2)
在JavaScript中,将值设置为null不会删除该属性,而是将值设置为null。在您的情况下,您应该删除令牌属性。
func saveUserSalaryInfo() {
var query = PFQuery(className:"User")
query.whereKey("username", equalTo: PFUser.currentUser()!.username!)
query.findObjectsInBackgroundWithBlock {
(users: [AnyObject]?, error: NSError?) -> Void in
if error != nil {
users["salaryMode"] = self.salaryMode
} else {
// Log details of the failure
//NSLog("Error: %@ %@", error, error.userInfo)
}
}
}
为彼得做同样的事。