提问者:小点点

使用变量构建嵌套对象的动态MongoDB/Mongoose查询


我的应用程序有4个相同的Node/ExpressAPI路由,旨在删除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上添加一个参数来将这四个路由重构为一个endpoint,该参数将成为表示四种社交媒体帐户类型之一的字符串变量。路由的目的是动态确定MongoDB用户文档中AuthProviders对象中要$unset(删除)的社交媒体帐户属性。

我试图构建MongoDB查询以使用ES6模板文字访问必要的对象属性,但是我收到一个错误:“SyntaError: Un的模板字符串”。

以下是我尝试使用ES6模板文字和社交媒体变量重构为单一endpoint的代码:

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查询以使用变量访问对象属性。


共2个答案

匿名用户

好的,我想出了如何实现这一点。发布决议以防另一个新生开发人员遇到这种情况。

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");
  });

相关问题