更新方法返回奇怪的数据,而不是更新的数据

时间:2018-11-02 13:47:28

标签: javascript node.js express mongoose

我在运行端点时会返回此对象的update方法有问题

  

{n:1,nModified:1,ok:1}

这是我尝试过的代码,我尝试使用 {new:true} ,但这无济于事,我想找回更新的数据。

router.put('/:username/experience/edit/:id', function(req, res) {
    const { title, company, location, from, to, workingNow, description } = req.body;

    User
    .update({'experience._id': req.params.id},
        {'$set': {
            'experience.$.title': title,
            'experience.$.company': company,
            'experience.$.location': location,
            'experience.$.from': from,
            'experience.$.to': to,
            'experience.$.workingNow': workingNow,
            'experience.$.description': description,
        }},
        function(err, model) {
            console.log(model);
            if(err){
                return res.send(err);
            }
            return res.json(model);
        });
})

1 个答案:

答案 0 :(得分:0)

如果您使用的是MongoDB 3.0或更高版本,则需要使用.findOneAndUpdate()并使用projection选项来指定要返回的字段子集。您还需要将returnNewDocument设置为true。当然,您需要在此处使用$elemMatch投影运算符,因为您不能使用位置投影并返回新文档。

有人指出:

  

您应该使用.findOneAndUpdate(),因为.findAndModify()在每个官方语言驱动程序中均已弃用。另一件事是,.findOneAndUpdate()的驱动程序之间的语法和选项非常一致。使用.findAndModify()时,大多数驱动程序不会通过“查询/更新/字段”键使用相同的单个对象。因此,当有人申请另一种语言来保持一致时,它会减少一些混乱。 .findOneAndUpdate()的标准化API更改实际上对应于服务器版本3.x,而不是3.2.x。完全的区别是shell方法在实现该方法时实际上落后于其他驱动程序(一次!)。因此,大多数驱动程序实际上都具有与3.x发行版相对应的主要发行版变更。

db.collection.findOneAndUpdate( 
    { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
         "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },  
    { $inc : { "rankings.$.score" : 1 } },  
    { 
        "projection": { 
            "rankings": { 
                "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") } 
            }
        }, 
        "returnNewDocument": true 
    }
)

从MongoDB 3.0开始,您需要使用findAndModifyfields选项,还需要将new设置为true来返回新值。 / p>

db.collection.findAndModify({   
    query: { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
        "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },     
    update: { $inc : { "rankings.$.score" : 1 } },       
    new: true,  
    fields: { 
        "rankings": { 
            "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
        }  
    }
})

两个查询都产生:

{
        "_id" : ObjectId("56d6a7292c06e85687f44541"),
        "rankings" : [
                {
                        "_id" : ObjectId("46d6a7292c06e85687f55543"),
                        "name" : "Ranking 2",
                        "score" : 11
                }
        ]
}