• mongoose连接collections会自动加s的问题解决


    问题的出现

      最近在用到mongoose连接数据库时遇到了这样的问题,我在mongoodb上创建了一个collection为course,然后在配置完mongoose连接数据库后拿到的是一个空对象。

      连接数据库当前集合的代码如下。

    //设计用户的集合 --- 设计表
    const mongoose = require('../db');
    const Schema = mongoose.Schema;     //当前数据库相应的集合对象
    //设计用户表集合
    const userSchema = new Schema({
        name: { type: String},
        age: { type: Number},
        sex: { type: Number},
        city: { type: String},
        company: { type: String}
    })
    //无则创建数据库集合并且连接,有则连接,并且暴露出去
    mongoose.model('Course', userSchema);
    
    module.exports = mongoose.model('Course', userSchema);

    看一下控制台:

    PS D:jcclesson3practiceweek1day04> node .find.js
    (node:12032) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMongoClient` option if using `connect()` or `createConnection()`. See http://mongoosejs.com/docs/4.x/docs/connections.html#use-mongo-client
    数据库连接成功
    []

      可以看到,查询之后,返回的是一个空数组,但是我本身的course集合里是有数据的,于是去查了官方的api。

    问题的原因:

      当没有传入collection参数时,Mongoose会通过model name(就是第一个参数),调用utils.toCollectionName方法产生一个collection name,而这个方法会使name变成复数形式。如果你不想要这个过程,只要传入collection name参数或设置Schema中的collection name选项。
      现在就知道了问题在哪里了(说实话这个设计让人难以理解)。

    问题的解决:

      我们可以设置mongoose.model()的第三个参数,代码如下。

    module.exports = mongoose.model('Course', userSchema,'course');

      或者,可以给Schema传入第二个参数,如下。

    const userSchema = new Schema({
        name: { type: String},
        age: { type: Number},
        sex: { type: Number},
        city: { type: String},
        company: { type: String}
    },{
        collection: 'course'
    })

    这样就可以解决问题了。

  • 相关阅读:
    深入理解Node.js垃圾回收与内存管理
    【File System】Node.js中文件操作模块File System
    【事件流】事件冒泡和事件捕获
    undefined 和null的区别?
    localStorage实现登录注册功能
    解刨for循环
    react中嵌入高德地图并Marker标点
    react页面中嵌入地图,标识出某个地点,使用插件react-amap
    react中使用antd的List组件,以及下载文件,List隔行变色
    公众号页面数据处理
  • 原文地址:https://www.cnblogs.com/mengshou/p/11688732.html
Copyright © 2020-2023  润新知