问题的出现

  最近在用到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:\jcc\lesson3practice\week1\day04> 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
数据库连接成功
[]

  可以看到,查询之后,返回的时一个空数组,但是我本身集合里是有内容的,于是去查了官方的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'
})

这样就可以解决问题了。

02-12 11:20