使用变量构建嵌套对象的动态 MongoDB/Mongoose 查询
Using variables to build dynamic MongoDB/Mongoose query of nested object
我的应用程序有 4 个相同的 Node/Express API 路由,用于删除 MongoDB 数据库中的嵌套对象 属性。这 4 条路由在语法上的唯一区别是字符串值("facebook"、"google"、"twitter" 或 "github"。这是四个路由之一:
app.get("/unlink/facebook", async (req, res) => {
await User.update(
{ _id: req.user._id },
{
$unset: {
"authProviders.facebook.facebookId": "",
"authProviders.facebook.facebookDisplayName": "",
"authProviders.facebook.facebookEmail": ""
}
}
);
res.redirect("/preferences");
});
我的目标是通过在 Express 路由的 URL 上添加一个参数,将这四个路由重构为一个端点,该参数将成为代表四种社交媒体帐户类型之一的字符串变量。该路线的要点是动态确定 authProviders 对象中的哪个社交媒体帐户 属性 到 $unset(删除) MongoDB 用户 文档。
我试图构建 MongoDB 查询以使用 ES6 模板文字访问必要的对象 属性,但是我收到错误消息:"SyntaxError: Unexpected template string".
下面是我尝试使用 ES6 模板文字和社交媒体变量重构为单一端点的代码:
app.get("/unlink/:account", async (req, res) => {
let accountType = req.params.account;
let email = accountType + "Email";
let id = accountType + "id";
let displayName = accountType + "DisplayName";
await User.update(
{ _id: req.user._id },
{
$unset: {
`authProviders[${accountType}][${id}]`: "",
`authProviders[${accountType}][${email}]`: "",
`authProviders[${accountType}][${displayName}]` : ""
}
}
);
res.redirect("/preferences");
});
这是 MongoDB 文档:
关于如何使这项工作有任何想法吗??我似乎无法弄清楚如何构造 MongoDB 查询以使用变量访问对象 属性。
好的,我想出了如何做到这一点。发布解决方案以防其他新手开发人员遇到此问题。
app.get("/unlink/:account", async (req, res) => {
let accountType = req.params.account,
query1 = "authProviders." + accountType + "." + accountType + "Id",
query2 = "authProviders." + accountType + "." + accountType + "Email",
query3 = "authProviders." + accountType + "." + accountType + "DisplayName";
await User.update(
{ _id: req.user._id },
{
$unset: {
[query1]: "",
[query2]: "",
[query3]: ""
}
}
);
res.redirect("/preferences");
});
你可以这样做:
app.get("/unlink/:account", async (req, res) => {
let accountType = req.params.account;
await User.update(
{ _id: req.user._id },
{
$unset: {
authProviders[`${accountType}.${accountType}id`]: "",
authProviders[`${accountType}.${accountType}email`]: "",
authProviders[`${accountType}.${accountType}displayName`] : ""
}
}
);
res.redirect("/preferences");
});
我的应用程序有 4 个相同的 Node/Express API 路由,用于删除 MongoDB 数据库中的嵌套对象 属性。这 4 条路由在语法上的唯一区别是字符串值("facebook"、"google"、"twitter" 或 "github"。这是四个路由之一:
app.get("/unlink/facebook", async (req, res) => {
await User.update(
{ _id: req.user._id },
{
$unset: {
"authProviders.facebook.facebookId": "",
"authProviders.facebook.facebookDisplayName": "",
"authProviders.facebook.facebookEmail": ""
}
}
);
res.redirect("/preferences");
});
我的目标是通过在 Express 路由的 URL 上添加一个参数,将这四个路由重构为一个端点,该参数将成为代表四种社交媒体帐户类型之一的字符串变量。该路线的要点是动态确定 authProviders 对象中的哪个社交媒体帐户 属性 到 $unset(删除) MongoDB 用户 文档。
我试图构建 MongoDB 查询以使用 ES6 模板文字访问必要的对象 属性,但是我收到错误消息:"SyntaxError: Unexpected template string".
下面是我尝试使用 ES6 模板文字和社交媒体变量重构为单一端点的代码:
app.get("/unlink/:account", async (req, res) => {
let accountType = req.params.account;
let email = accountType + "Email";
let id = accountType + "id";
let displayName = accountType + "DisplayName";
await User.update(
{ _id: req.user._id },
{
$unset: {
`authProviders[${accountType}][${id}]`: "",
`authProviders[${accountType}][${email}]`: "",
`authProviders[${accountType}][${displayName}]` : ""
}
}
);
res.redirect("/preferences");
});
这是 MongoDB 文档:
关于如何使这项工作有任何想法吗??我似乎无法弄清楚如何构造 MongoDB 查询以使用变量访问对象 属性。
好的,我想出了如何做到这一点。发布解决方案以防其他新手开发人员遇到此问题。
app.get("/unlink/:account", async (req, res) => {
let accountType = req.params.account,
query1 = "authProviders." + accountType + "." + accountType + "Id",
query2 = "authProviders." + accountType + "." + accountType + "Email",
query3 = "authProviders." + accountType + "." + accountType + "DisplayName";
await User.update(
{ _id: req.user._id },
{
$unset: {
[query1]: "",
[query2]: "",
[query3]: ""
}
}
);
res.redirect("/preferences");
});
你可以这样做:
app.get("/unlink/:account", async (req, res) => {
let accountType = req.params.account;
await User.update(
{ _id: req.user._id },
{
$unset: {
authProviders[`${accountType}.${accountType}id`]: "",
authProviders[`${accountType}.${accountType}email`]: "",
authProviders[`${accountType}.${accountType}displayName`] : ""
}
}
);
res.redirect("/preferences");
});