如果以前有人问过我,我不会感到惊讶,但是我没有找到一个可行的例子。
基本上,我在一组对象数组内有一组布尔数据,我想重用我的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变量传递,但都没有成功。有什么想法吗?
答案 0 :(得分: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
}