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

});

Sopeterは最初とその後に作成され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

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 に答える