Node.js mongoose中的唯一索引不工作

Node.js mongoose中的唯一索引不工作,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我试图在mongoose中为字段创建一个唯一的索引(“event_key”),如果我试图创建一个重复条目,我希望mongodb不要保存。我查看了文档,似乎我需要做的就是在模式中设置索引:{unique:true},但我似乎无法让它工作。我尝试了几种不同的排列方式,但仍然无法使其发挥作用 此外,required:true似乎也不起作用,因为即使我没有传递事件密钥,我也可以保存条目。我可能错过了一些非常愚蠢的事情,想知道是否有人能帮忙 模式 var WistiaAnalyticSchema = ne

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

此外,
required:true
似乎也不起作用,因为即使我没有传递事件密钥,我也可以保存条目。我可能错过了一些非常愚蠢的事情,想知道是否有人能帮忙

模式

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在后台创建索引,因此您需要延迟
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)
    });
});

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

Mongoose在后台创建索引,因此如果您一次完成所有操作,它可能不会像预期的那样工作,因为您最终会在创建索引之前添加文档。@JohnnyHK谢谢您的评论!那么你知道一个解决方法吗?添加到@johnyhk,要添加延迟,你需要一个接一个地运行所有这些命令。为此,您可以使用async.js。签出此墨迹以获取更多信息Mongoose会在后台创建索引,因此,如果您一次完成所有操作,它可能无法按预期工作,因为您最终会在创建索引之前添加文档。@JohnnyHK感谢您的评论!那么你知道一个解决方法吗?添加到@johnyhk,要添加延迟,你需要一个接一个地运行所有这些命令。为此,您可以使用async.js。查看此墨水了解更多信息谢谢。我尝试了代码,它甚至在等待了一段时间后也不会创建任何条目。我想知道我设置索引的方式是否有问题?非常感谢你的帮助@丹东嗯…当我使用Mongoose 3.8.12尝试它时,它工作得很好。我发现我的错误,我不小心复制了field event_键,您的代码现在可以工作了。非常感谢你!非常感谢。我尝试了代码,它甚至在等待了一段时间后也不会创建任何条目。我想知道我设置索引的方式是否有问题?非常感谢你的帮助@丹东嗯…当我使用Mongoose 3.8.12尝试它时,它工作得很好。我发现我的错误,我不小心复制了field event_键,您的代码现在可以工作了。非常感谢你!