FindOneAndUpdate不使用传入的参数更新嵌套字段

时间:2015-12-17 08:27:20

标签: node.js mongodb mongoose updating meanjs

我正在尝试创建一个可用于更新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}},但结果是一样的。

2 个答案:

答案 0 :(得分:1)

默认情况下,

findOneAndUpdate()将返回文档,而不是新(已更新)文档。

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

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

答案 1 :(得分:0)

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

$首先出现的原因可能是基于这个主题: findOneAndUpdate - Update the first object in array that has specific attribute

或者我读过的关于这个问题的许多主题中的另一个。我曾尝试使用和不使用多种解决方案,但无法做任何事情。