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

杰森·麦克法兰

如果以前有人问过我,我不会感到惊讶,但是我还没有找到一个可行的例子。

基本上,我在对象数组内部有一组布尔数据,并且我想重用我的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在这里,我已对密钥进行了published硬编码,但我希望此密钥具有动态性,因此可以从发布请求的正文中获取它

const { DYNAMIC_KEY , isChecked } = req.body

"posts.$[el].$[DYNAMIC_KEY]": isChecked`

我尝试$set用反引号格式化字符串,在查询外部构建它,并将其作为1变量传递,但都没有成功。有任何想法吗?

苏莱曼·萨

您可以使用方括号表示法实现此目的:

router.post("/project/:id/:postid", async (req, res) => {

  const { isChecked, dynamicKey } = req.body;
  let set = `posts.$[el].${dynamicKey}`;

  console.log(set);

  const result = await Project.findOneAndUpdate(
    { _id: req.params.id },
    { $set: { [set]: isChecked } },
    {
      arrayFilters: [{ "el._id": req.params.postid }],
      new: true
    }
  );

  res.send(result);
});

我有一个包含以下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
}

../project/5def81070066dc23e05b816e/5def81070066dc23e05b8170通过以下机构向路由器发送发帖请求

{
  "isChecked": false,
  "dynamicKey": "published"
}

结果是这样的:(帖子(ID为5def81070066dc23e05b8170)的发布值已更新为false)

{
    "_id": "5def81070066dc23e05b816e",
    "posts": [
        {
            "_id": "5def81070066dc23e05b8171",
            "published": true,
            "homepage": false
        },
        {
            "_id": "5def81070066dc23e05b8170",
            "published": false,
            "homepage": false
        },
        {
            "_id": "5def81070066dc23e05b816f",
            "published": true,
            "homepage": false
        }
    ],
    "__v": 0
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章