Mongoose - InsertMany 方法,upsert:true?

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

我正在使用 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
    的方法或查找并删除所有项目...
  • 禁用 ObjectID 生成
  • 禁用
    _v
    生成

希望有人已经做过类似的事情并找到了完美的解决方案!

javascript mongodb mongoose bulkinsert upsert
1个回答
0
投票

要禁用 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 });
© www.soinside.com 2019 - 2024. All rights reserved.