mongoose 为什么只更新数组的第二项?

omjgkv6w  于 2022-11-13  发布在  Go
关注(0)|答案(2)|浏览(157)

我试图做的是用一些数据更新一个或多个用户。我接收一个数组中的用户电话号码,exp:["+1234555", "+1222222"]。我遍历它们,检查它们是否存在。如果存在,我更新用户模型中的数据。问题是,假设我有两个用户要更新。当我执行函数时,只有第二个用户被更新,第一个用户没有。

exports.createNotifications= asyncHandler(async (req, res, next) => {
  const { userPhone, someData } = req.body;

  let createUserData;
  let updateUserData;
  let findUser;

  const createData = async () => {
    userPhone.map(async (phone) => {
      findUser = await Users.findOne({ phone: phone}).then(
        async (user) => {
          if (user) {
            updateUserData= await Users.findOneAndUpdate(
              { phone: phone},
              { $push: { someData : someData } },
              { new: true }
            );
          }
        }
      );
    });
  };

  await createNotifications();
  await new Promise((resolve) => setTimeout(resolve, 1000));
  console.log(updateUserData)

  res.status(200).json({
    success: true,
  });
});

如何同时更新这两个用户?

toiithl6

toiithl61#

它失败了,因为你没有等待你的“Map”中内置的异步函数(实际上你用异步、等待和承诺搞砸了很多)。
考虑到您共享的代码是无效的,我假设createData和createNotifications是相同的。
你可以把这个创造 Package 成承诺,然后等待它完成

const createNotifications = () => {
  return userPhone.map(async (phone) => {
    const user = await Users.findOne({ phone: phone})
    if (user) {
      await Users.findOneAndUpdate(
        { phone: phone},
        { $push: { someData : someData } },
        { new: true }
      )
    }
  })
}

Promise.all(createNotifications())
  .then(() => {
    res.status(200).json({
      success: true,
    })
  })

注:未测试代码

ttvkxqim

ttvkxqim2#

userPhone.map(phone => {
  let data = await Users.updateMany({
    phone
  }, {
    $push: {
      someData: someData
    }
  }, {
    new: true
  })
});

相关问题