猫鼬和独特的领域

Posted

技术标签:

【中文标题】猫鼬和独特的领域【英文标题】:Mongoose & unique field 【发布时间】:2014-03-25 03:58:24 【问题描述】:

我有以下带有猫鼬的架构:

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

对于msisdnimsi,我有unique选项。

在某些情况下,此条件得到很好的遵守。 对于以下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);
  );
);

直接运行就可以了:

julio$ mocha test/controllers/ctrl_sim.js 

但是如果我通过隐性选项运行它,它会失败:

  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'

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

有什么想法吗?

【问题讨论】:

【参考方案1】:

使用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 
);

在运行测试之前,重启 mongodb

【讨论】:

我无法理解dropDups 的用法。你能详细说明一下吗? @VikasBansal 我猜如果你将 dropDups 设置为 true,mongodb 将删除以前创建的重复项(如果有) @HasaanAli 不完全 - dropDups 意味着 MongoDB 将“丢弃”任何尝试使用数据库中已存在的模式值创建记录的查询。例如:如果您已经有一条带有 name:bob 的记录,并且您尝试插入另一条带有 name:bob 的记录,那么由于 dropDups,此插入将失败。 @Rishav 如果您使用的是mongoose,我认为email: type: String, unique: true 可能无法正常工作。我还没有测试过,但可能是这样的:如果你的数据值在那里,那么你添加了密钥unique: true,应该不起作用。(如果那里没有数据,没有检查)。您应该在 MongoDB shell 中创建索引,然后使用 mongoose。你可以参考我的另一个答案:***.com/a/56302405/291240 @WilliamHu 是的,只要索引是在插入文档之前创建的。 mongoose 文档将此称为race。 :P mongoosejs.com/docs/… 所以当我设置dropDups 时,天气它首先保存或创建索引第一个dropDupsunique 启动。工作吗:)

以上是关于猫鼬和独特的领域的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬和 q 承诺

使用猫鼬和打字稿创建模式

使用猫鼬和打字稿创建模式

使用猫鼬和nestJS自动增加字段

猫鼬和浮点值

text 安装快递,猫鼬和身体解析器