唯一和稀疏索引会导致重复错误

时间:2012-12-16 18:26:15

标签: node.js mongoose

我有这样的事情:

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.1sparse

我认为设置null的索引允许多个true值。正确设置索引,因为mongolab后端的“索引”标签显示uniquesparse的{​​{1}}。我有什么想法可以得到错误吗?

2 个答案:

答案 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)
        }
    }

}

为彼得做同样的事。

详情请参阅删除:Remove a property from a JavaScript object