首页 > 解决方案 > MongoDB 仅在数据不存在时插入数据(在 Javascript 中)

问题描述

我正在创建一个网络爬虫,我需要将我的数据存储在 MongoDB 中。我抓取一些数据并将其存储在变量调用项中。如果它已经存在,我也不会将数据添加到数据库中。所以这是我应该执行此操作的 resultAnalysis.mjs 文件。我应该在这段代码中更改什么,因为它不插入数据并且还会抛出错误:

TypeError: Cannot destructure property 'lotNumber' of 'item' as it is undefined.
at file:///Users/AlainMolleyres/Desktop/scraper_V1/resultsAnalysis.mjs:48:11
at runMicrotasks (<anonymous>)
at processTicksAndRejections (internal/process/task_queues.js:93:5)

这是我的代码

结果分析.mjs

mongoose
 .connect(mongoURI, { useNewUrlParser: true })
 .then(() => console.log("MongoDB connected"))
 .catch((err) => console.error(err));

export const compareAndSaveResults = (item) => {
 try {
   const Schema = mongoose.Schema;

   const lotSchema = new Schema({
     lotNumber: {},
     artistName: {},
     artworkNameOriginal: {},
     pictureUrl: {},
     artworkDate: {},
     signed: {},
     titled: {},
     technic: {},
     literature: {},
     provenance: {},
     dimension: {},
     lowEstimation: {},
     highEstimation: {},
     currency: {},
     soldPrice: {},
     lotUrl: {},
   });

   const lot = mongoose.model("lot", lotSchema);

   lot
     .find({}, function (err, lotList) {
       return lotList;
     })
     .then((lotList) => {
       if (lotList == "") {
         console.log(`A new data was created:\n${JSON.stringify(item)}`);
         const newLot = new lot(item);
         return newLot.save().catch((err) => console.log(err));
       }

       const {
         lotNumber,
         artistName,
         artworkNameOriginal,
         pictureUrl,
         artworkDate,
         signed,
         titled,
         technic,
         literature,
         provenance,
         lowEstimation,
         highEstimation,
         currency,
         soldPrice,
         dimensionInCm,
         lotUrl,
       } = item;

       const dbId = lotList[0]._id;
       const dbArtworkNameOriginal = lotList[0].artworkNameOriginal;
       const dbLotUrl = newsList[0].lotUrl;

       let catchDifference = false;

       if (dbArtworkNameOriginal !== artworkNameOriginal) {
         catchDifference = true;
       } else {
         dbLotUrl.forEach((elem, i) => {
           if (elem !== lotUrl[i]) catchDifference = true;
         });
       }

       if (catchDifference) {
         console.log("A new evidence was found, updating database...");
         mongoose.set("useFindAndModify", false);
         return News.findOneAndUpdate({ _id: dbId }, item);
       }

       console.log("File is equal to page, no lot to report");
     })
     .then(() => {
       mongoose.disconnect();
     })
     .catch((err) => console.log(err));
 } catch (err) {
   console.error(err);
 }
};

``

标签: javascriptmongodbmongooseinsert

解决方案


推荐阅读