Javascript 动态更新对象数组中的键+;猫鼬
如果以前有人问过这个问题,我不会感到惊讶,但我还没有找到一个有效的例子 基本上,我在一个对象数组中有一组布尔数据,我希望重用我的API路由/逻辑来动态更新对象数组 数据示例:Javascript 动态更新对象数组中的键+;猫鼬,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,如果以前有人问过这个问题,我不会感到惊讶,但我还没有找到一个有效的例子 基本上,我在一个对象数组中有一组布尔数据,我希望重用我的API路由/逻辑来动态更新对象数组 数据示例: { "_id": 1, "posts": [ { "_id": d323d32, "published": true, "homepage": false, (...moreBooleanData) }, { "_id": ffwfwfwc, "published": true
{
"_id": 1,
"posts": [
{ "_id": d323d32, "published": true, "homepage": false, (...moreBooleanData) },
{ "_id": ffwfwfwc, "published": true, "homepage": false, (...moreBooleanData) },
{ "_id": fdscsdad, "published": true, "homepage": false, (...moreBooleanData) }
]
}
猫鼬查询
await Project.findOneAndUpdate(
{ _id: 1 },
{ $set: { "posts.$[el].published": isChecked } },
{
arrayFilters: [{ "el._id": postid }],
new: true
}
)
问题出在这一行“posts.$[el].published”:isChecked
。在这里,我发布了密钥硬编码
,但我希望这个密钥是动态的,这样我就可以从我的post请求主体中获取它
const { DYNAMIC_KEY , isChecked } = req.body
"posts.$[el].$[DYNAMIC_KEY]": isChecked`
我尝试过用反勾号格式化
$set
字符串,在查询外部构建它并将其作为1个变量传递,但都没有成功。有什么想法吗?您可以使用括号表示法实现这一点:
router.post(“/project/:id/:posted”),异步(req,res)=>{
const{isChecked,dynamicKey}=req.body;
设set=`posts.$[el].${dynamicKey}`;
控制台日志(set);
const result=await Project.findOneAndUpdate(
{{u id:req.params.id},
{$set:{[set]:isChecked},
{
数组过滤器:[{“el.\u id”:req.params.postid}],
新:真的
}
);
res.send(结果);
});
我有一份包含以下3个帖子的项目文档:
{
"_id" : ObjectId("5def81070066dc23e05b816e"),
"posts" : [
{
"_id" : ObjectId("5def81070066dc23e05b8171"),
"published" : true,
"homepage" : false
},
{
"_id" : ObjectId("5def81070066dc23e05b8170"),
"published" : true,
"homepage" : false
},
{
"_id" : ObjectId("5def81070066dc23e05b816f"),
"published" : true,
"homepage" : false
}
],
"__v" : 0
}
我将post请求发送到我的路由器。/project/5def81070066dc23e05b816e/5def81070066dc23e05b8170
:
{
"isChecked": false,
"dynamicKey": "published"
}
结果如下:(post的(id为5def81070066dc23e05b8170)发布值更新为false)
这可能是我所看到的最彻底的答案。非常感谢,我以前有过类似的东西,但我没有像您在这里那样将构建的字符串包装在括号中
{$set:{[set]:isChecked}
。再次感谢
{
"_id": "5def81070066dc23e05b816e",
"posts": [
{
"_id": "5def81070066dc23e05b8171",
"published": true,
"homepage": false
},
{
"_id": "5def81070066dc23e05b8170",
"published": false,
"homepage": false
},
{
"_id": "5def81070066dc23e05b816f",
"published": true,
"homepage": false
}
],
"__v": 0
}