我正在使用 Mongoose
.insertMany
方法用对象数组填充 imagesSchema
。
想知道如何将
upsert:true
与 .insertMany()
或其他方法一起使用来更新/删除所有对象,以防第二次运行此函数。
我们如何禁用默认 MongoDB ObjectID 的生成和
_v
?
架构:
const imagesSchema = new mongoose.Schema(
{
catalogue: String,
productID: String,
position: Number,
id: Number,
name: String,
alttag: String,
file: String,
type: String,
saved: String,
status: String
},
{
collection: "images",
_id: false,
upsert: true
}
);
//things that do not work
imagesSchema.plugin(uniqueValidator);
const Images = mongoose.model("Images", imagesSchema);
module.exports = Images;
代码:
Catalogue.findOne({ domain: userApiProducts.domain }, "allProducts", function(
err,
products
) {
if (err) console.error(err);
(function() {
var productsARR = [];
var productsOBJ = { data: [] };
new Promise(function(resolve, reject) {
resolve();
})
.then(function() {
var id = 0;
products.allProducts.forEach(function(x) {
var catalogueID = x._id;
for (var i = 0; i < x.media_gallery_entries.length; i++) {
var filename = x.media_gallery_entries[i].file;
function type() {
return filename
.substr((~-filename.lastIndexOf(".") >>> 0) + 2)
.toUpperCase();
}
id++;
productsARR.push({
catalogue: products._id,
productID: x._id,
position: x.media_gallery_entries[i].position,
id: id,
name: x.name,
alttag: x.media_gallery_entries[i].label,
file: x.media_gallery_entries[i].file,
type: type(),
saved: "0.00 KB",
status: "SYNCING"
});
}
});
if (productsARR.length === productsARR.length) {
productsOBJ.data = productsARR;
var arr = productsOBJ.data;
Images.insertMany(arr, function(error, docs) {});
}
})
.catch(function(e) {
console.log(e);
});
})();
});
输出:
{
"_id" : ObjectId("58795c440d5e554357bfb155"),
"__v" : 0,
"catalogue" : "5879356f8d94cf6a32cd7536",
"productID" : "58795c440d5e554357bfb143",
"position" : 2,
"id" : 17,
"name" : "Al treilea",
"alttag" : null,
"file" : "/g/r/grafolio_angel_and_devil_thumbnail_1_1_1_3_3_3.jpg",
"type" : "JPG",
"saved" : "0.00 KB",
"status" : "SYNCING"
},
{
"_id" : ObjectId("58795c440d5e554357bfb153"),
"__v" : 0,
"catalogue" : "5879356f8d94cf6a32cd7536",
"productID" : "58795c440d5e554357bfb142",
"position" : 2,
"id" : 15,
"name" : "Al treilea",
"alttag" : null,
"file" : "/g/r/grafolio_angel_and_devil_thumbnail_1_1_1_1.jpg",
"type" : "JPG",
"saved" : "0.00 KB",
"status" : "SYNCING"
} //etc
输出是正确的,但我需要:
upsert:true
的方法或查找并删除所有项目..._v
生成希望有人已经做过类似的事情并找到了完美的解决方案!
要禁用 mongodb 中的自动 ObjectId(autoIndexId) 有两种方法。
1.如果您想禁用_id字段的自动生成,您可以在插入文档时将其显式设置为您选择的值。例如: db.demoCollection.insertOne({ _id: "myCustomID", 姓名: "John Wick", 年龄: 30 });
2.或者您可以通过在架构中定义它来关闭它。 { 集合:'youCollection',autoIndexId:false}。 关于官方文档中的autoindexid。
要在 mongodb 中禁用 _v,请在定义模式时编写以下内容:
const mySchema = new mongoose.Schema({
// Your schema fields here...
}, { versionKey: false });