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 后端显示的“索引”选项trueuniquesparse. 任何想法为什么我会收到错误?

4

2 回答 2

5

如果文档具有该字段,则稀疏索引仅对该字段进行索引。该字段是否设置为或其他值无关紧要,如果存在,仍会检查其唯一性。null

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

于 2012-12-16T18:59:51.360 回答
2

在 JavaScript 中,将值设置为 null 不会删除该属性,而是将值设置为 null。在您的情况下,您应该删除令牌属性。

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

对彼得做同样的事情。

有关删除的更多信息:从 JavaScript 对象中删除属性

于 2015-06-03T14:27:48.203 回答