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

zem*_*rco 2 mongoose node.js

我有这样的事情:

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');
  });

});
Run Code Online (Sandbox Code Playgroud)

因此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 }
Run Code Online (Sandbox Code Playgroud)

代码尝试了mongolab运行mongo v2.0.7mongoose v3.5.1.

我想设置一个索引来sparse允许多个null值.索引已正确设置为mongolab后端的"索引"选项卡显示trueuniquesparse.有什么想法我得到错误?

Joh*_*yHK 5

一个稀疏索引只索引字段如果文档具有该领域.无论字段设置为null或其他值都无关紧要,如果存在,仍会检查其唯一性.

因此,在您的情况下,省略设置token字段而不是将其设置为null.