猫鼬错误-具有相同型号名称的猫鼬模型

时间:2018-10-04 10:55:26

标签: mongodb mongoose mongoose-schema mongoose-models

我正在开发NodeJs应用程序,并且正在使用猫鼬节点包。

示例代码

我正在使用以下方法创建动态集合,这些集合有时无法将数据持久存储在数据库中-

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

我正在使用此导出的模块基于作为suffix参数传递的唯一ID创建动态集合。这样的事情(跳过不必要的代码)-

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

问题

问题是,测试2失败! insertmany API导致0条记录未能通过计数断言。

如果我们交换测试顺序,则测试1将失败。

如果我分别运行两个测试,则两个都将通过。

如果有n个测试,则只有第一个测试通过,其余测试将失败。


发现

我怀疑mongoose model creation step有问题,因为它使用的是相同的型号名称。 Model,同时创建多个模型实例。

我将其更改为关注,并且测试在所有情况下均能正常工作-

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

问题

这给我留下了以下问题-

  • 创建动态集合时,我遵循正确的编码约定吗?
  • 可疑代码是否是导致此问题的真正原因(型号名称也应该唯一)吗?
  • 如果是,为什么会失败? (我遵循mongoose docs,但是它没有提供任何有关模型名称参数唯一性的信息。

谢谢。

1 个答案:

答案 0 :(得分:0)

我要在dbModel1上调用insertMany方法,其中将变量声明为dbModel2。

从以下位置更改测试2:

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

收件人:

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