我对MongoDb / Mongoose相当陌生,对SQL Server或Oracle更加熟悉。
对于事件,我有一个非常简单的架构。
EventSchema.add({
pkey: { type: String, unique: true },
device: { type: String, required: true },
name: { type: String, required: true },
owner: { type: String, required: true },
description: { type: String, required: true },
});
我正在查看Mongoose索引,该索引显示了两种方法,我使用了字段定义。
我还有一个非常简单的API,可以接受POST并在此集合上调用create来插入记录。
我编写了一个测试,该测试检查是否不应插入具有相同pkey的记录,并且unique:true是否起作用。我已经有一组事件,可以读取到数组中,所以我只再次发布这些事件中的第一个,然后看看会发生什么,我希望mongo DB会抛出E11000重复键错误,但这没有发生。
var url = 'api/events';
var evt = JSON.parse(JSON.stringify(events[0]));
// POST'ed new record won't have an _id yet
delete evt._id;
api.post(url)
.send(evt)
.end(err, res) {
err.should.exist;
err.code.should.equal(11000);
});
测试失败,没有错误,并且插入了重复的记录。
当我查看集合时,我可以看到两个记录,两个记录都具有相同的pkey(原始记录和我为测试发布的副本)。我确实注意到第二条记录的创建日期与第一条记录的创建日期相同,但后来的修改日期相同。
(mongo希望我使用最新的修改版本记录吗????,URL不同,ID也一样)
[ { _id: 2,
pkey: '6fea271282eb01467020ce70b5775319',
name: 'Event name 01',
owner: 'Test Owner',
device: 'Device X',
description: 'I have no idea what\'s happening',
__v: 0,
url: '/api/events/2',
modified: '2016-03-23T07:31:18.529Z',
created: '2016-03-23T07:31:18.470Z' },
{ _id: 1,
pkey: '6fea271282eb01467020ce70b5775319',
name: 'Event name 01',
owner: 'Test Owner',
device: 'Device X',
description: 'I have no idea what\'s happening',
__v: 0,
url: '/api/events/1',
modified: '2016-03-23T07:31:18.470Z',
created: '2016-03-23T07:31:18.470Z' }
]
我以为是唯一的:在字段定义上为true告诉mongo db这是您想要的,mongo在保存时为您实施了此操作,或者也许我只是误解了一点...
在SQL术语中,您创建了一个可在URL查找中使用的键,但是您可以构建一个唯一的复合索引,以防止重复插入。我需要能够定义事件中的哪些字段使记录唯一,因为在表单数据POST上,表单的提交者没有下一个可用的_id值,而是使用_id(由“ mongoose-auto-increment”完成) ),以便该应用程序其他部分中使用的网址是干净的,例如
/events/1
而不是一团糟的复合值,例如
/events/Event%20name%2001%5fDevice%20X%5fTest%20Owner
我将要开始编写代码,所以现在我只针对此单个字符串编写了一个简单的测试,但是实际的架构中还有更多字段,并且将使用它们的组合来获得唯一性,我真的想获得初始值。在开始添加更多测试,更多字段和更多代码之前进行测试工作。
我应该做些什么来确保第二条记录实际上不会被插入?
好的,它似乎与索引没有关系,因为在第二次插入之前,索引没有时间进行更新(因为在我的测试套件中,它们之间只有9ms的时间)。
我还找到了其他有关约束的文章:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句