Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose型号保存错误E11000_Node.js_Mongodb_Mongoose - Fatal编程技术网

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)因为我在更改架构后没有删除数据库。