2

I am working on a NodeJs application and I am using mongoose node package.

Sample Code

I am using following method to create dynamic collections and these collections sometimes fail to persist the data in database -

const Mongoose = require("mongoose");

const Schema = new Mongoose.Schema({
    // schema goes here
});

module.exports = function (suffix) {
    if (!suffix || typeof suffix !== "string" || !suffix.trim()) {
        throw Error("Invalid suffix provided!");
    }
    return Mongoose.model("Model", Schema, `collection_${suffix}`);
};

I am using this exported module to create dynamic collections based on unique ids passed as suffix parameter. Something like this (skipping unnecessary code) -

const saveData = require("./data-service");
const createModel = require("./db-schema");

// test 1
it("should save data1", function (done) {
    const data1 = [];
    const response1 = saveData(request1); // here response1.id is "cjmt8litu0000ktvamfipm9qn"
    const dbModel1 = createModel(response1.id);
    dbModel1.insertMany(data1)
        .then(dbResponse1 => {
            // assert for count
            done();
        });
});

// test 2
it("should save data2", function (done) {
    const data2 = [];
    const response2 = saveData(request2); // here response2.id is "cjmt8lm380006ktvafhesadmo"
    const dbModel2 = createModel(response2.id);
    dbModel2.insertMany(data2)
        .then(dbResponse2 => {
            // assert for count
            done();
        });
});

Problem

The issue is, test 2 fails! It the insertmany API results in 0 records failing the count assert.

If we swap the the order of the tests, test 1 will fail.

If I run the two tests separately, both will pass.

If there are n tests, only first test will pass and remaining will fail.


Findings

I suspected the mongoose model creation step to be faulty as it is using the same model name viz. Model while creating multiple model instances.

I changed it to following and the tests worked perfectly fine in all scenarios -

return Mongoose.model(`Model_${suffix}`, Schema, `collection_${suffix}`);

Questions

This leaves me with following questions -

  • Am I following correct coding conventions while creating dynamic collections?
  • Is suspected code the actual cause of this issue (should the model name also be unique)?
  • If yes, why is it failing? (I followed mongoose docs but it doesn't provide any information regarding uniqueness of the model name argument.

Thanks.

planet_hunter
  • 3,866
  • 1
  • 26
  • 39

1 Answers1

0

I you are calling insertMany method on dbModel1, where you variable is declared to dbModel2.

Change your test 2 from:

dbModel1.insertMany(data2)
        .then(dbResponse1 => {
            // assert for count
            done()
        });

To:

dbModel2.insertMany(data2)
        .then(dbResponse1 => {
            // assert for count
            done()
        });
cnps
  • 151
  • 10
  • I think you edited your post while I was typing, and it looks like you corrected mistakes. Do you still have the issue? Or was it just a typo? – cnps Oct 04 '18 at 11:16
  • Thanks for the response! It was a typo in the example code snippet. :) – planet_hunter Oct 04 '18 at 12:14