我正在尝试使用Express动态更新我的Mongoose模型字段。
从ajax调用发送到路由处理程序的数据如下:
{ value: true, name: 'settings.follow.state' }
如您所见,该值是“点号表示的字符串?”我想将其用作更新我的猫鼬模型的字段选择器。
所以我的客户ajax调用看起来像这样:
$("[name='settings.follow.state']").on("change",function () {
$.ajax({
url : window.location.pathname +"/update",
type : "POST",
contentType: "application/json",
data : JSON.stringify({
value : $(this).is(":checked"),
name : "settings.follow.state"
}),
success:function (response) {
console.log(response);
}
});
});
此外,使用express时是否需要JSON.stringify我的数据?
这是我的Express路线处理程序:
router.post("/:id/update",[
oneOf([
check("value","Field cannot be empty.").isBoolean(),
check("value","Field cannot be empty.").not().isEmpty()
]),
check("name","Missing name field.").not().isEmpty(),
],function (req,res,next) {
let errors = validationResult(req);
if(!errors.isEmpty()){
return res.status(400).send(errors.array()[0].msg);
}
Profile.findOne({_id:req.params.id,user:req.user._id}, function (err,doc) {
if(err) return next(err);
if(doc !== null){
TwitterSettings.findOne({_id:doc.settings},function (err,doc) {
if(err) next(err);
if(doc !== null){
//HERE is where I would like to update the dynamic fields/values
doc.set(req.body.name,req.body.value);
//Tried with no avail :-(
// doc.set([req.body.name],req.body.value);
// doc.set(`${req.body.name}`,req.body.value);
doc.save(function (err,doc) {
if(err) return next(err);
if(doc !== null){
return res.status(200).json(doc);
}
return res.status(400).send("Could not update profile.");
});
}else{
return res.status(400).send("Could find profile settings to update.");
}
});
// TRIED findOneAndUpdate too
// TwitterSettings.findOneAndUpdate({_id:doc.settings},{$set:{[req.body.name] : req.body.value}},{"new":true},function (err,doc) {
// if(err) return next(err);
// if(doc !== null){
// return res.status(200).json(doc);
// }else{
// return res.status(400).send("Could not update profile.");
// }
// });
}else{
return res.status(400).send("Could find profile to update.");
}
});
});
我的猫鼬模式架构(以防万一,您需要):
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const schema = new Schema({
followers : {type:Number,default:0},
followings : {type:Number,default:0},
follow:{
state : {type:Boolean,default:false},
},
un_follow:{
state : {type:Boolean,default:false}
},
follow_back:{
state : {type:Boolean,default:false}
},
});
const model = mongoose.model('TwitterSettings', schema);
module.exports = model;
我确信有人比我聪明,可以指出正确的方向。
谢谢 卡尔
答案 0 :(得分:0)
好的,因此您有一个名为TwitterSettings
的集合,并且想更新follow.state
路径上的值。
我通常会使用nessy module。
const nessy = require( "nessy" );
...
Profile.findOne({_id:req.params.id,user:req.user._id}, function (err,doc) {
...
TwitterSettings.findOne({_id:doc.settings},function (err,doc) {
...
nessy( req.body.name, req.body.value, doc );
doc.save( function( err, doc ) {
...
} );
...
} );
...
} );
请记住,req.body.name
实际上包含settings.follow.state
,因此应从req.body.name
中删除它:
nessy( req.body.name.replace(/^settings\./, ""), req.body.value, doc );
编辑
实际上,基于注释,您可以简单地使用model.set()
和点符号,其中不包含settings.
。