猫鼬和独特的领域

Jul*_*lio 39 mocha.js mongoose mongodb

我有以下mongoose模式:

var SimSchema = new Schema({
    msisdn     : { type : String , unique : true, required : true },
    imsi       : { type : String , unique : true, required : true },
    status     : { type : Boolean, default: true},
    signal     : { type : Number },
    probe_name : { type:  String , required : true }
});
Run Code Online (Sandbox Code Playgroud)

我有unique选择msisdnimsi.

在某些情况下,这种情况得到了很好的尊重.对于以下mocha测试:

"use strict";

var app      = require('../../app');
var http     = require('http');
var request  = require('supertest');
var mongoose = require('mongoose');
var should   = require('should');



describe('[ Sim controller ] ', function(){
  before(function(done) {
    app.set_env('test');
    this.server = app.start(function() {
      mongoose.connection.db.dropDatabase(function() {
        done();
      })
    });
  });


  beforeEach(function(done){
    done();
  });


  it('Sim with good parameters should be created in the database', function(done){
    var newSim = {
      msisdn:     '1234',
      imsi:       '007',
      probe_name: 'BOUCHON_1'
    };

    request(this.server)
      .post('/sims')
      .set('Content-Type', 'application/json')
      .send(newSim)
      .expect(200).end(function(err, res) {
        if (err) return done(err);
        res.body.should.have.property('imsi');
        res.body.should.have.property('probe_name');
        res.body.should.have.property('msisdn');
        setTimeout(function() {
          done();
        }, 1000);
      });
  });


  it('Sim imsi/msisdn is unique in the database', function(done){
    var newSim = {
      msisdn:     '1234',
      imsi:       '007',
      probe_name: 'BOUCHON_1'
    };

    request(this.server)
      .post('/sims')
      .set('Content-Type', 'application/json')
      .send(newSim)
      .expect(200).end(function(err, res) {
        if (err) return done(err);
        res.body.should.have.property('error').equal('Duplicate Item');
        done();
      });
  });


  after(function(done) {
    app.stop(done);
  });
});
Run Code Online (Sandbox Code Playgroud)

如果我直接运行它,它工作正常:

julio$ mocha test/controllers/ctrl_sim.js 
Run Code Online (Sandbox Code Playgroud)

但如果我运行它,由于隐性选项,它失败了:

  1) [ Sim controller ]  Sim imsi/msisdn is unique in the database:
     Uncaught AssertionError: expected { __v: 0,
  imsi: '007',
  msisdn: '1234',
  probe_name: 'BOUCHON_1',
  _id: '530a2b7f52273aa90783baf0',
  status: true } to have property 'error'
Run Code Online (Sandbox Code Playgroud)

我在堆栈上读到有时unique条件没有得到很好的尊重,因为索引没有刷新.你认为这是我的情况吗?实际上,我删除了每个mocha测试套件的数据库.也许mongo没有时间每次都重新创建所有索引.

任何的想法?

Hüs*_*BAL 54

使用dropDups保证下探重复记录您的架构一样;

var SimSchema = new Schema({
    msisdn     : { type : String , unique : true, required : true, dropDups: true },
    imsi       : { type : String , unique : true, required : true, dropDups: true },
    status     : { type : Boolean, default: true},
    signal     : { type : Number },
    probe_name : { type:  String , required : true }
});
Run Code Online (Sandbox Code Playgroud)

在运行测试之前,请重新启动mongodb

  • 我无法理解`dropDups`的用法.你能详细说说吗? (7认同)
  • @HasaanAli不太完全-dropDups表示MongoDB将“删除”所有尝试创建数据库中已存在的架构值的记录的查询。例如:如果您已经有一个带有`name:bob`的记录,并且您尝试插入另一个带有`name:bob`的记录,那么由于dropDups,该插入将失败。 (4认同)
  • @VikasBansal我想如果你把dropDups设置为true,那么mongodb会丢弃之前创建的重复项,如果有的话 (3认同)
  • @Rishav如果您使用的是`mongoose`,我认为`email: {type: String, unique: true}`可能无法正常工作。我还没有测试过,但可能是这样的:如果你的数据值在那里,那么你添加了键“unique: true”,应该不起作用。(如果那里没有数据,则没有检查)。您应该在 MongoDB shell 中创建索引,然后使用 mongoose。您可以参考我的另一个答案:/sf/answers/3941168381/ (3认同)
  • @WilliamHu 是的,只要在插入文档之前创建索引就可以。“mongoose”文档将其称为“race”。:P https://mongoosejs.com/docs/validation.html#the-unique-option-is-not-a-validator 因此,当我设置“dropDups”时,它首先保存或创建索引第一个“dropDups” ` 或 `unique` 开始起作用。可以完成工作:) (2认同)