Javascript 动态更新对象数组中的键+;猫鼬

Javascript 动态更新对象数组中的键+;猫鼬,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,如果以前有人问过这个问题,我不会感到惊讶,但我还没有找到一个有效的例子 基本上,我在一个对象数组中有一组布尔数据,我希望重用我的API路由/逻辑来动态更新对象数组 数据示例: { "_id": 1, "posts": [ { "_id": d323d32, "published": true, "homepage": false, (...moreBooleanData) }, { "_id": ffwfwfwc, "published": true

如果以前有人问过这个问题,我不会感到惊讶,但我还没有找到一个有效的例子

基本上,我在一个对象数组中有一组布尔数据,我希望重用我的API路由/逻辑来动态更新对象数组

数据示例:

{
    "_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
}