Mongoose - InsertMany Method, upsert:true?
Asked Answered
I

1

14

I'm using Mongoose .insertMany method to populate the imagesSchema with an array of objects.

Wondering how to go about using upsert:true with .insertMany() or another method to update/remove all objects in case this function is run a second time.

Also how can we Disable Default MongoDB ObjectID's Generation and _v?

Schema:

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;

Code:

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);
      });
  })();
});

      

Output:

{
    "_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

The output is correct but I need to:

  • Find a way to use upsert:true or find and Remove all Items...
  • Disable ObjectID Generation
  • Disable _v Generation

Hope someone has already worked on something similar and found the perfect solution for this !

Iceman answered 14/1, 2017 at 0:1 Comment(2)
Don't know about Mongoose, but in the underlying MongoDb upsert is supported by update, not insert. In native MongoDB updateMany is the command but I don't know about it's availability in Mongoose: docs.mongodb.com/manual/reference/method/…. It requires a common filter for documents, so bulk.update might be more appropriate.Flow
to disable ObjectID (_id) and Version (__v), use the schema options as: { collection: 'images', autoIndexId: false, versionKey: false }Withindoors
T
1

To disable the auto ObjectId(autoIndexId) in mongodb there are 2 ways.

  1. If you want to disable the automatic generation of the _id field, you can explicitly set it to a value of your choice when inserting documents. For example:
db.demoCollection.insertOne({ _id: "myCustomID", name: "John Wick", age: 30 });
  1. Or you can turn it off by defining this in your schema:
    { collection: 'youCollection', autoIndexId: false}.

About autoindexid in official doc.

And to disable _v in mongodb write this when defining you schema:

const mySchema = new mongoose.Schema({
  // Your schema fields here...
}, { versionKey: false });
Turmoil answered 24/9, 2023 at 13:45 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.