【问题标题】:Unique index in mongoose not working猫鼬中的唯一索引不起作用
【发布时间】:2014-07-29 04:20:19
【问题描述】:

我正在尝试在 mongoose 中为字段(“event_key”)创建唯一索引,如果我尝试创建重复条目,我希望 mongodb 不保存。我查看了文档,似乎我需要做的就是在架构中设置index: {unique: true},但我似乎无法让它工作。我尝试了几种不同的排列,但仍然无法正常工作。

此外,required: true 似乎也不起作用,因为即使我没有传入 event_key,我也可以保存条目。我可能错过了一些非常愚蠢的东西,想知道是否有人可以提供帮助?

架构

var WistiaAnalyticSchema = new Schema({
  event_key: {type: String, required: true, index: {unique: true}},
  visitor_key: String,
  created: {type: Date, default: Date.now},
  ip: String,
})

尝试添加到数据库

WistiaAnalytic.create({event_key: '1402230270487e0.2668362990953028'}, function(err) {});
WistiaAnalytic.create({event_key: '1402229819163e0.4385743956081569'}, function(err) {});
WistiaAnalytic.create({ip: '1402229819163e0.4385743956081569'}, function(err) {});
WistiaAnalytic.create({event_key: '1402229819163e0.4385743956081569'}, function(err) {
  console.log(err)
});

【问题讨论】:

  • Mongoose 在后台创建索引,因此如果您一次性完成所有操作,它可能无法按预期工作,因为您最终会在有机会创建索引之前添加文档。
  • @JohnnyHK 感谢您的评论!那您知道解决方法吗?
  • 添加到@JohnnyHK,要添加延迟,您需要一个接一个地运行所有这些命令。为此,您可以使用 async.js。查看此墨水以获取更多信息stackoverflow.com/questions/17181248/…

标签: node.js mongodb mongoose


【解决方案1】:

Mongoose 在后台创建索引,因此您需要延迟create 调用,直到索引创建完成。一种方法是使用模型的 'index' 事件:

WistiaAnalytic.on('index', function(err) {
    WistiaAnalytic.create({event_key: '1402230270487e0.2668362990953028'}, function(err) {});
    WistiaAnalytic.create({event_key: '1402229819163e0.4385743956081569'}, function(err) {});
    WistiaAnalytic.create({ip: '1402229819163e0.4385743956081569'}, function(err) {});
    WistiaAnalytic.create({event_key: '1402229819163e0.4385743956081569'}, function(err) {
      console.log(err)
    });
});

【讨论】:

  • 谢谢。我尝试了代码,即使等待了一段时间,它也不会创建任何条目。我想知道我设置索引的方式是否有问题?非常感谢您的帮助!
  • @DanTang 嗯...当我使用 Mongoose 3.8.12 进行尝试时效果很好。
  • 我发现我的错误,我不小心复制了字段 event_key,你的代码现在可以工作了。非常感谢!
猜你喜欢
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2014-11-12
  • 2018-08-29
  • 2016-08-05
  • 2012-06-25
相关资源
最近更新 更多