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

问题描述 投票:1回答:1

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

基本上,我在一组对象数组内有一组布尔数据,并且我想重用我的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变量传递,但都没有成功。有什么想法吗?

javascript mongodb mongoose
1个回答
0
投票

您可以使用括号表示法来实现:

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
}
© www.soinside.com 2019 - 2024. All rights reserved.