猫鼬和独特的领域
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
);
对于msisdn
和imsi
,我有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
时,天气它首先保存或创建索引第一个dropDups
或unique
启动。工作吗:)以上是关于猫鼬和独特的领域的主要内容,如果未能解决你的问题,请参考以下文章