【问题标题】:FindOneAndUpdate not updating nested field with passed in parametersFindOneAndUpdate 不使用传入的参数更新嵌套字段
【发布时间】:2016-03-23 15:24:18
【问题描述】:

我正在尝试创建一个可用于更新 Mongoose 模型中的嵌套字段的服务。在以下示例中,我尝试将字段“meta.status”设置为值 2。这是服务:

angular.module('rooms').factory('UpdateSvc',['$http', function($http)
{
    return function(model, id, args)
    {
            var url = '/roomieUpdate/' + id;

            $http.put(url, args).then(function(response)
            {
                response = response.data;
                console.log(response.data);
            });
    }
}]);

这是它在控制器中的调用方式:

var newStatus = {'meta.$.status' : 2};
var update = UpdateSvc("roomie", sessionStorage.getItem('userID'), newStatus);

这是模型:

var RoomieSchema = new Schema(
{
    meta: 
    {
        created:
        {
            type: Date,
            default: Date.now
        },
        status:
        {
            type: Number,
            default: '1',
        }
    }
}

这是路线:

app.put('/roomieUpdate/:id', function(req,res)
{
    var id = req.params.id;
    Roomie.findOneAndUpdate(
        {_id: mongoose.Types.ObjectId(id)},

        req.body,
        { new : true },
        function(err, doc)
        {
            if(err)
            {
                console.log(err);
            }
            res.json(doc);
            console.log(doc);
        });
});

参数被正确接收,但我似乎无法让它工作。我什至没有收到错误消息。 console.log(doc) 只是打印出对象,字段 meta.status 保持为“1”。我已经对目标对象进行了直接的 Mongo 搜索,以确保我不只是在阅读旧文档。我尝试了很多方法,比如分离 req.body 的键和值并使用 {$set:{key:value}},但结果是一样的。

【问题讨论】:

    标签: node.js mongodb mongoose updating meanjs


    【解决方案1】:

    事实证明,var newStatus = {'meta.$.status' : 2};应该是 var newStatus = {'meta.status' : 2};文档现在可以正确更新。

    $ 最初出现的原因可能是基于这个线程: findOneAndUpdate - Update the first object in array that has specific attribute

    或我阅读的有关此问题的许多线程中的另一个。我尝试了几种有无它的解决方案,但都没有成功。

    【讨论】:

      【解决方案2】:

      findOneAndUpdate() 默认返回文档,而不是新的(更新的)文档。

      为此,您需要设置new 选项:

      Roomie.findOneAndUpdate({
        _id : mongoose.Types.ObjectId(id)
      }, req.body, { new : true }, function(err, doc) {
        ...
      });
      

      【讨论】:

      • 不幸的是,这也会产生相同的结果。我添加了 {new:true} 子句,因为它现在在我的代码中。我也有 upsert:true 以前也没有帮助。谢谢。
      猜你喜欢
      • 2019-09-27
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 2021-09-19
      • 2021-02-09
      • 2022-11-01
      • 2016-09-13
      • 2018-09-13
      相关资源
      最近更新 更多