这个基本的mongoose模型代码在初始调用时返回一个空结果(gamemgr),但在随后的调用中有效。它不应该在初始upsert时返回一个填充的result对象吗?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 );
    }
);

最佳答案

在Mongoose4.0中,new(和findByIdAndUpdate)的findOneAndUpdate选项的默认值已更改为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 );
    }
);

07-28 09:33