防止猫鼬重复记录

唯一编码

我对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的时间)。

  • 需要对等待“索引”的插入做一些事情
  • 需要在API方面,因为不是API的所有用户都是Web应用程序

我还找到了其他有关约束的文章:

猫鼬独特:真不行

唯一索引不适用于Mongoose / MongoDB

MongoDB / Mongoose对Date字段的唯一约束

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章