【问题标题】:How to declare collection name and model name in mongoose如何在猫鼬中声明集合名称和模型名称
【发布时间】:2017-02-26 00:18:48
【问题描述】:

我有 3 种记录,

1)Categories,
2)Topics  and
3)Articles 

在我的 mongodb 中,我只有 1 个名为 'categories' 的集合,其中我浏览了上述 3 种类型的文档。

对于这 3 个模块,我以如下方式编写了 3 个模型(每个一个),

mongoose.model('categories', CategorySchema);
mongoose.model('categories', TopicSchema)
mongoose.model('categories', ArticlesSchema)

like....mongoose.model('collection_name', Schema_name)

但是当我运行我的代码时,它会抛出错误

Cannot overwrite `categories` model once compiled.

如果我像这样改变上述模型,

mongoose.model('category','categories', CategorySchema);
mongoose.model('topics','categories', TopicSchema)
mongoose.model('articles','categories', ArticlesSchema)

它正在创建 2 个我不想要的名为主题和文章的集合。 这是我现在的问题,谁能建议我帮忙.....谢谢....

【问题讨论】:

  • 你必须为 3 个模式定义 3 个模型
  • 换句话说,模型直接映射到 a 集合的 one 文档。您在这里尝试做的事情是不可能的——因为您的数据库中确实有 一个 模型/集合,其中包含文档,这些文档本身包含您用来区分的类型属性。跨度>

标签: node.js mongodb mongoose


【解决方案1】:

试试-

mongoose.model('category', CategorySchema, 'categories');
mongoose.model('topics', TopicSchema, 'categories');
mongoose.model('articles', ArticlesSchema, 'categories');

如文档中所述:http://mongoosejs.com/docs/api.html#index_Mongoose-model

Mongoose#model(name, [schema], [collection], [skipInit])

定义模型或检索它。

参数:

  • 第一个参数 - 名称 型号名称
  • 第二个参数 - [schema] 模式名称
  • 第三个参数 - [collection] 集合名称(可选,从模型名称中得出)
  • 第 4 个参数 - [skipInit] 是否跳过初始化(默认为 false)

见 - https://stackoverflow.com/a/14454102/3896066

【讨论】:

  • “第一个参数是您的模型所属集合的单数名称。Mongoose 会自动查找您的模型名称的复数版本” - 直接来自模型文档 -- mongoosejs.com/docs/models.html
【解决方案2】:

正如你所说, 当你写这篇文章时,

mongoose.model('categories', CategorySchema);
mongoose.model('categories', TopicSchema);
mongoose.model('categories', ArticlesSchema);

输出变得不合适所以 改为这样做,

mongoose.model('category', CategorySchema);
mongoose.model('topic', TopicSchema);
mongoose.model('article', ArticlesSchema);

奖金提示。 Mongoose 默认将您的收藏名称设为复数,因此如果您想要您所写的收藏名称,请更改一些代码。

mongoose.model('category', CategorySchema,'category');
mongoose.model('topic', TopicSchema,'topic');
mongoose.model('article', ArticlesSchema,'article');

【讨论】:

    【解决方案3】:

    “第一个参数是您的模型所属集合的单数名称。Mongoose 会自动查找您的模型名称的复数版本”——直接来自模型文档 -- https://mongoosejs.com/docs/models.html

    【讨论】:

      【解决方案4】:

      您可以为此使用 Mongoose 鉴别器 (http://mongoosejs.com/docs/discriminators.html)。

      这篇文章有一个很好且简单的例子来说明如何做到这一点:https://docs.microsoft.com/en-us/azure/cosmos-db/mongodb-mongoose#using-mongoose-discriminators-to-store-data-in-a-single-collection

      【讨论】:

        【解决方案5】:

        mongoose.model() 方法按以下顺序接受参数,

        name: string,
        schema: Schema, 
        collection?: string, 
        skipInit?: Boolean
        

        示例

        mongoose.model('todoModel','todoSchema', 'todoCollection');
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-17
          • 2019-02-17
          • 2021-04-17
          • 2019-10-17
          • 1970-01-01
          • 1970-01-01
          • 2015-10-20
          相关资源
          最近更新 更多