我正在用node.js + puppeteer + mongoose构建一个网络抓取工具。我从网页上获取数据,并且可以将其保存到数据库中。下一步是能够检查文档是否已存在于数据库中。一直在寻找并尝试许多方法而没有成功。 这是我的代码的一部分,它将数据保存到db:
try {
const newCar = new Car({
make: make,
model: model,
year: year,
km: km,
price: price
});
let saveCar = await newCar.save();
console.log(saveCar);
console.log('car saved!');
} catch (err) {
console.log('err' + err);
}
在我的模式中,我添加了时间戳选项:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const carSchema = new Schema({
make: {
type: String
},
model: {
type: String
},
year: {
type: String
},
km: {
type: String
},
price: String
}, {timestamps: true });
module.exports = mongoose.model('Car', carSchema);
因此,我希望有人可以以此将我推向正确的方向。有没有一种方法可以使用createdAt时间戳检查数据库中是否已存在文档,并在抓取时跳过该文档?
编辑。我一直在尝试使用该哈希解决此问题。这是我的代码:
const hash = md5(assetsUrl);
const existingCar = Car.find({
'hash': { $exists: true }
});
if (!existingCar) {
try {
const newCar = new Car({
make: make,
model: model,
year: year,
km: kmInt,
price: priceInt,
currency: currencyString,
carUrl: carUrl,
imageUrl: imageUrls,
hash: hash
});
let saveCar = await newCar.save();
console.log(saveCar);
console.log('car saved!');
} catch (err) {
console.log('err' + err);
}
} else {
console.log('car already in db');
}
这不起作用,代码每次都落在else块上。我在这里想念什么?
答案 0 :(得分:0)
有很多方法可以处理您的案件:
1.在记录here is more上创建唯一索引,这将验证db中数据的排他性。在您的情况下,这意味着您可以跳过其他逻辑并继续解析已保存的文档,因为不会将数据加倍。
2。每次访问时都创建页面哈希,并将哈希存储在数据库中。可以找到更多here或here。在您的特定情况下,您可以在首次访问时创建页面的哈希,然后验证数据库中哈希中的内容是否已更改。如果是这样,请进行解析,否则请跳过页面。
3。如果您只是想验证数据库中是否没有相同的数据并且不想添加唯一索引,则必须首先为数据库中的相同数据findOne
。可以找到更多here