从 mongoose Nodejs 中删除重复文档

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

伟大的人们,我是 Mongoose 的新手,我需要你们的帮助。如何删除重复的文档?我尝试了下面的代码。但我收到错误 forEach 不是函数。以下是我的控制器中的内容。这是正确的吗?或者它应该在我的架构中?

我希望它的工作方式是,当数据进来时,将其存储在数据库中,并且聚合根据newId删除重复记录。

请帮忙

const addProductAgain = require("../models/AddProductAgain");
const dailyReport = require("../models/aggregatedProducts");
const { StatusCodes } = require("http-status-codes");
const { BadRequestError, UnauthenticatedError, NotFoundError } = require("../errors/index");

//POST REQUEST TO LOGIN A USER
const cronTest2 = async (req, res) => {
  console.log("this is cron job 1");
  const data = req.body;
  const cloudDBTwo = data.map((items) => ({
    productName: items.productName,
    shelfLife: items.shelfLife,
    productId: items.productId,
    todayDate: items.todayDate,
    timeEntered: items.timeEntered,
    timeToExpire: items.timeToExpire,
    timeProductExpired: items.timeProductExpired,
    productWeight: items.productWeight,
    panType: items.panType,
    createdBy: items.createdBy,
    expire: items.expire,
    isReturned: items.isReturned,
    isSoldOut: items.isSoldOut,
    RandSStatus: items.RandSStatus,
    location: items.location,
    newId: items._id.slice(-14),
  }));

  try {
    const cloudAddTheProduct = await dailyReport.insertMany(cloudDBTwo);
    console.log(cloudAddTheProduct);
  } catch (error) {
    console.log(error);
  }

//   REMOVES DUPLICATE DATA
  if (cloudAddTheProduct !== "") {
    try {
      await addProductAgain
        .aggregate([
          {
            $group: {
              _id: { newId: "$newId" },
              newId: { $addToSet: "$_id" },
              count: { $sum: 1 },
            },
          },
          {
            $match: {
              count: { $gt: 1 },
            },
          },
        ])
        .forEach(function (doc) {
          doc.newId.shift();
          db.addProductAgain.remove({
            _id: { $in: doc.newId },
          });
        });
    } catch (error) {
      console.log(error);
    }
  }

  res.status(StatusCodes.CREATED).send("saved");
};

module.exports = cronTest2;
node.js database mongodb mongoose aggregate
1个回答
0
投票

虽然此代码片段在语法上看起来可能合理,但值得注意的是,在异步上下文中将 forEach 与 wait 一起使用可能会出现问题。

在 MongoDB Node.js 驱动程序中,forEach 本身并不处理异步操作,因为它是同步操作的。因此,在 forEach 中使用 wait 可能不会产生预期的结果,并且可能会导致不可预测的行为或错误。

为了缓解这种情况,您可能需要探索替代方案,例如 forEachAsync 或 map 与 Promise.all 结合使用,以在循环内正确等待异步操作。

你可以做这样的事情:

    if (cloudAddTheProduct !== "") {
    try {
        const aggregationResult = await addProductAgain.aggregate([
            {
                $group: {
                    _id: { newId: "$newId" },
                    newId: { $addToSet: "$_id" },
                    count: { $sum: 1 },
                },
            },
            {
                $match: {
                    count: { $gt: 1 },
                },
            },
        ]).toArray();

        await Promise.all(aggregationResult.map(async (doc) => {
            doc.newId.shift();
            await db.addProductAgain.deleteMany({
                _id: { $in: doc.newId },
            });
        }));
    } catch (error) {
        console.log(error);
    }
}

res.status(StatusCodes.CREATED).send("saved");
© www.soinside.com 2019 - 2024. All rights reserved.