Node.js Mongoose型号保存错误E11000
我有以下模式:Node.js Mongoose型号保存错误E11000,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有以下模式: var loftSchema = new mongoose.Schema({ name : { type: String, trim: true, required: true }, location : { type: { type: String, enum: 'Point', default: 'Point'}, coordinates: { type: [Number], default: [0,0] } }, rad
var loftSchema = new mongoose.Schema({
name : { type: String, trim: true, required: true },
location : { type: { type: String, enum: 'Point', default: 'Point'}, coordinates: { type: [Number], default: [0,0] } },
radius : { type: Number, required: true },
private : { type: Boolean, required: true },
created : { type: Date, default: Date.now },
updated : { type: Date, default: Date.now },
members : [{ type: mongoose.Schema.ObjectId, ref: 'Users'}],
posts : [{ type: mongoose.Schema.ObjectId, ref: 'Posts'}]
});
请注意,成员和帖子都是对其他Mongoose模式的引用。
下面是我用来创建Loft
对象的函数
function createLoft(req, res) {
var params = req.body;
var deferred = q.defer();
var form = new multiparty.Form();
var image, lat, lon, name, radius, private, path, creatorID;
form.on('file', function(name, file){
path = file.path;
});
// listen on field event for title
form.on('field', function(key, value){
if(key == "lat"){
lat = value;
}else if(key == "lon"){
lon = value;
}else if(key == "name"){
name = value;
}else if(key == "radius"){
radius = value;
}else if(key == "creator_id"){
creatorID = value;
}else if(key == "private"){
private = value;
}else return;
});
// listen on part event for image file
form.on('part', function(part){
if (!part.filename) return;
if (part.name !== 'image') return part.resume();
image = {};
image.filename = part.filename;
image.size = 0;
part.on('data', function(buf){
image.size += buf.length;
});
});
form.on('close', function(){
var response = { "status": 200, "created": null };
var created = new Loft({
name: name,
location: { type: 'Point', coordinates: [lat, lon] },
radius: radius,
private:private
});
response.created = created;
created.members = [creatorID];
created.attach('image', {'path': path}, function(err){
if(err){
response.status = 500;
response.created = err;
deferred.resolve(response);
return;
}else {
response.created = created;
created.save(function (err, object) {
if (err) {
response.status = 400;
response.created = err;
}
deferred.resolve(response);
});
}
});
});
// parse the form
form.parse(req);
return deferred.promise;
}
我从客户端(iOS)进行多部分上传,并在服务器上解析表单。在我第一次创建阁楼时,一切都很好,我能够添加相应的用户id作为组的第一个成员。但是,如果我再打一次电话,我会收到以下信息:
{
"name": "MongoError",
"code": 11000,
"err": "insertDocument :: caused by :: 11000 E11000 duplicate key error index: loft.lofts.$creator_id_1 dup key: { : null }"
}
我的目标是能够创建与MongoDB生成的_id字段几乎完全相同的放样。每次我尝试创建类似的阁楼时,都会抛出该错误。有没有办法绕过这个问题?这个错误是什么意思?它意味着LOFT集合的创建者id字段被设置为唯一索引。但是,我在您的模式中没有看到它。我可能错过了它,或者您是否更改了您的模式并使用了它?不出现此错误的唯一方法是删除该唯一索引要求。如果修复代码没有成功,您可能必须使用shell重新编制mongo索引 使用
mongo
登录终端中的shell,然后键入使用loft
切换数据库。您可以使用db.lofts.getIndexes()
查看索引-您可能会看到creator\u id字段。您可以使用db.lofts.reindex()
您可能需要评估代码,因为创建者id可能需要是唯一的字段,但这由您根据需要确定。这是因为1)我没有设置sparse:true,2)因为我在更改架构后没有删除数据库。