问题的出现:
最近在用到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' })
这样就可以解决问题了。