问题的出现:
最近在用到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
数据库连接成功
[]
可以看到,查询之后,返回的是一个空数组,但是我本身的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'
})
这样就可以解决问题了。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章