【问题标题】:Mongoose findByIdAndUpdate upsert returns null document on initial insertMongoose findByIdAndUpdate upsert 在初始插入时返回空文档
【发布时间】:2015-08-03 21:55:29
【问题描述】:

这个基本的 Mongoose 模型代码在初始调用时返回空结果 (gameMgr),但在后续调用中有效。它不应该在初始 upsert 上返回一个填充的结果对象吗? mongo 记录存在,在相同的情况下再次运行代码,一切正常,因为没有插入。

如果预期结果对象为空,那么创建新对象的合适模式是什么? (或者我是否使用 另一个 db 调用重新加载并进一步陷入回调疯狂?)

GameManagerModel.findByIdAndUpdate(
    game._id,
    {$setOnInsert: {user_requests:[]}}, 
    {upsert: true},
    function(err, gameMgr) {
        console.log( gameMgr ); // NULL on first pass, crashes node
        gameMgr.addUserRequest( newRequest );
    }
);

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

    在 Mongoose 4.0 中,findByIdAndUpdate(和findOneAndUpdate)的new 选项的默认值已更改为false(请参阅release notes)。这意味着您需要将选项显式设置为 true 以获取由 upsert 创建的文档:

    GameManagerModel.findByIdAndUpdate(
        game._id,
        {$setOnInsert: {user_requests:[]}}, 
        {upsert: true, new: true},
        function(err, gameMgr) {
            console.log( gameMgr );
            gameMgr.addUserRequest( newRequest );
        }
    );
    

    【讨论】:

    • 完美,谢谢! Ye ol' 隐藏在 ye ol' 发行说明中的​​参数再次来袭。文档当前显示“new: bool - true 返回修改后的文档而不是原始文档。默认为 true”mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate
    • 我对为什么 mongoose 更改了默认设置有点困惑。我觉得很奇怪
    猜你喜欢
    • 2021-10-23
    • 2019-07-15
    • 2017-02-07
    • 2019-04-04
    • 2014-09-26
    • 2013-08-14
    • 1970-01-01
    • 2018-08-18
    • 2015-04-18
    相关资源
    最近更新 更多