mongoose save()操作正在生成重复的_id

时间:2017-11-29 20:34:11

标签: node.js mongodb mongoose mongoose-schema

我有以下mongoose架构:

var mongoose = require('mongoose');

module.exports = mongoose.model('lf', {
    _set : {type:Number},
    a : {type:String},
    b : {type:String},
    c : {type:Number},
    created_at  : {type: Date, default: Date.now},
    updated_at  : {type: Date, default: Date.now}
},'flr');

在我的代码中,我查询了一些集合并生成了一个包含上述模式的拼接json对象。

虽然当我在mongoose上进行save()操作时,我一直得到:

Collection1.findOne({tfC: tfC}).lean().then(FP=> {
    if ( FP!== null && FP!== undefined ){
        new linkedFixed(FP).save(function(err, result){
            console.log(err);
            process.exit();
        });
    }
}).catch(error => {
    console.error(error);
});

我收到错误:

{ MongoError: E11000 duplicate key error collection: Da.flr index: _id_ dup key: { : ObjectId('5a0c8b3f10dfe503505fcaec') }  at Function.MongoError.create

我没有在我的架构中定义这个_id,所以为什么mongoose会在这个索引上生成重复的条目?

我能够理解查找中的json对象已经包含_id。然后我删除了这个,我收到错误:

MongooseError: document must have an _id before saving

如何在不传递_id的情况下将json对象保存到集合中? SHould'nt _id是由mongoose随机分配的吗?

3 个答案:

答案 0 :(得分:0)

问题来自精益()。当使用精益_id从mongoose查询返回时。

如果删除lean()_id不是文档内容的一部分,因此不会覆盖。

答案 1 :(得分:0)

在findOne方法中使用$ project以避免从查询返回_id(Object ID),如下所示:     Collection1.findOne({tfC: tfC},{_id:0})

有关详细信息,请参阅MongoDB Aggregation $project

答案 2 :(得分:0)

正如@JoaoFilipeClementeMartins所说,问题在于你正在获得_id,你正在将_id传递给新对象并尝试保存它。另一种可能的解决方案是在将_id设置为新对象之前删除它。

delete FP._id;
new linkedFixed(FP).save(function(err, result){