业务架构:
var BusinessSchema = new Schema({
owners: {type: Array},
templates:[{
_id : ObjectId,
title : String,
path : String,
custom_navigation : Boolean
}]
});
业务集合如下所示:
{"owners" : [
ObjectId("522fa2d61685d3f4ce000002")
],
"templates" : [
{
"_id" : ObjectId("524c3bacc7ba62c549000004"),
"custom_navigation" : true
},
{
"_id" : ObjectId("524c3bacc7ba62c549000005")
},
{
"_id" : ObjectId("524c3bacc7ba62c549000006")
}
]}
更新存储在模板数组中的特定模板的功能:
var Business = require('../models/business.js');
Business.update({'owners' : req.user._id, "templates._id" : req.body._id}, {
$set : {"templates.$.custom_navigation" : req.body.custom_navigation}
},
function(err, numUpdated){
console.log(numUpdated);
if(numUpdated > 0){
res.json(200, req.body);
}else{
res.json(404);
}
});
当我输出update
函数的搜索参数时,我看到了:
{ owners: 522fa2d61685d3f4ce000002,
'templates._id': '524c3bacc7ba62c549000004' }
注意,Mongoose似乎将req.user._id识别为ObjectId,但req.body._id作为字符串传递。我尝试将其转换为ObjectId但没有结果。无论template._id设置为什么,update语句总是更新templates数组中的第一项。
答案 0 :(得分:0)
您需要按对象ID进行搜索,而不是通过req.body._id进行搜索(我猜它是一个整数)
var templateId = require('mongoose').Types.ObjectId;
Business.update({'owners' : req.user._id, "templates" : {$elemMatch :{ _id: new templateId(req.body._id)}}},
....