猫鼬findOneAndReplace替换文档为空

时间:2020-05-25 11:28:18

标签: node.js mongodb mongoose

我想用一个模型(配置)替换一个文档,为此,我正在使用findOneAndReplace方法。 但是,猫鼬用空文件代替了文件。

我将方法调用为:

let updateData = { _id: '5ecba01dbac0c68120535f40', data: 'newData' };

Configuration.findOneAndReplace({ uuid : req.params.uid }, updateData, (err, conf) => {
    if ( err ) {
        sendErrorResponse ( res, err );
    } else {
        res.json ( {
            status : 1,
            data   : conf
        } );
    }
} );

在日志中,我可以看到:

configurations.findOneAndReplace({ uuid: 'default' }, {}, { _id: '5ecba01dbac0c68120535f40', data: 'newData' }, projection: {}})

根据文档,第二个参数应该是替换文件,但是猫鼬将替换文件作为第三个参数传递,第二个参数为空。我认为这就是将它在数据库中设置为空的原因。

现在代替这个,如果我使用findOneAndUpdate,它可以正常工作。我在日志中得到以下内容:

configurations.findOneAndUpdate({ uuid: 'default' }, { '$set': { _id: '5ecba01dbac0c68120535f40', data: 'newData' }}, { upsert: false, projection: {}, returnOriginal: true })

但是我想替换文档而不是更新它。我是否缺少某些东西,或者这可能是猫鼬中的错误?

1 个答案:

答案 0 :(得分:1)

我们最近也遇到了类似的问题-将选项设置为空对象并在连接设置中启用useFindAndModify为我们解决了该问题:

// connection-setup

mongoose.connect('mongodb://...', { useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify:true });

// findOneAndReplace call

Configuration.findOneAndReplace({ uuid : req.params.uid }, updateData, {}, (err, conf) => {
        ...
});

还有这个github issue可能会有所帮助。