node.js - 唯一和稀疏索引导致重复错误

标签 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 }

代码在 mongolab 上试过运行 mongo v2.0.7mongoose v3.5.1

我认为将索引设置为 sparse 允许多个 null 值。索引已正确设置为 mongolab 后端中的“索引”选项卡显示 true uniquesparse。我为什么会收到错误有什么想法吗?

最佳答案

A sparse index仅当文档该字段时才索引该字段。该字段是设置为 null 还是其他值并不重要,如果存在,仍会检查其唯一性。

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

关于node.js - 唯一和稀疏索引导致重复错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13904246/

相关文章:

json - MongoDB/Node : Insert part of a doc in a collection into a doc in another collection

mongodb - 字段和模式级别的 Mongoose 索引

javascript - MongoDB 顺序执行查询而不是并行执行

node.js - Mongoose 将 _id'ss 保存为字符串而不是 ObjectId

javascript - 如何使用 npm 库 Telegraf 一次从数据库中的 ID 列表向所有电报机器人用户发送消息

node.js - underscore.js 与 consolidate.js : how to change templateSettings?

javascript - javascript 中的 'use' 关键字是什么?

javascript - 如何将标签 "a"中数据库中的值插入到属性 href

javascript - 在 MongoDB 中使用嵌套属性查找文档

javascript - Mongoose :排序