伟大的人们,我是 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;
虽然此代码片段在语法上看起来可能合理,但值得注意的是,在异步上下文中将 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");