我正在尝试创建一个可用于更新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}},但结果是一样的。
答案 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
或者我读过的关于这个问题的许多主题中的另一个。我曾尝试使用和不使用多种解决方案,但无法做任何事情。