Mongoose 错误 - 具有相同型号名称的 Mongoose 型号

Posted

技术标签:

【中文标题】Mongoose 错误 - 具有相同型号名称的 Mongoose 型号【英文标题】:Mongoose Error - Mongoose models with same model name 【发布时间】:2019-03-09 17:50:47 【问题描述】:

我正在开发一个 NodeJs 应用程序,我正在使用 mongoose 节点包。

示例代码

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

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】:

我是在 dbModel1 上调用 insertMany 方法,其中你的变量被声明为 dbModel2。

将您的测试 2 更改为:

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

收件人:

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

【讨论】:

我想你在我打字的时候编辑了你的帖子,看起来你纠正了错误。你还有这个问题吗?还是只是一个错字? 感谢您的回复!这是示例代码 sn-p 中的错字。 :)

以上是关于Mongoose 错误 - 具有相同型号名称的 Mongoose 型号的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 更新条件 PDT 日期/型号 ISO 日期

Mongoose:引用自定义字段名称

在具有相同行值名称的部分中显示行

Mongoose - 更新时如何验证模型?

两台相同型号的笔记本电脑之间的 Angular 编译器速度很慢

无法将带有点的键(键路径)添加到具有以下类型的 Mongoose 字段:Schema.Types.Mixed