Mongoose读取集合数据始终返回空?关于Mongoose会自动添加的坑爹的"s"

在使用Node.js + Express + MongoDB搭建团队官网时,遇到MongoDB通过Mongoose读取admin集合数据始终为空的问题。经过7小时排查,发现是由于Mongoose自动添加的"s"字段导致。在数据库中,admin集合包含username、password、name和rank字段,但路由控制器无法正确获取数据。解决方案在于理解并处理Mongoose的这一特殊行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在用Node.js+express+MongoDB搭建团队官网,说实话有点后悔用了MongoDB。虽然MongoDB基于文档的数据存储方式很让人心动,但是感觉数据的组织结构显得很混乱,对于用惯了Mysql的我来说感觉很不舒服。并且其实团队官网这种项目不适合用MongoDB 这种数据库,纯当学习吧。

今天在写后台管理页面的登录功能时遇到了一点问题,花费了至少7个小时,,,很心累。先简述一下背景:

1.数据库中有一个admin集合,注意,是admin,集合中的文档包含了username、password、name、rank

2.路由控制器中接受页面传来的username和password,对比数据库看是否成功登录。

以上就是简要背景,遇到的问题就是:无论怎么改代码,从数据库中取出的值始终是空的。

以下是代码:

//schema
var mongoose = require('mongoose');
var AdminSchema = new mongoose.Schema({
	username: String,
	password: String,
	member: String,
	rank: String
});
module.exports = AdminSchema;

//model
var mongoose = require('mongoose');
var AdminSchema = require('../schemas/admin');
var Admin = mongoose.model('Admin', AdminSchema);

/*
*
*  FUCK! FUCK MONGOOSE! FUCK MONGODB!!!!!
*  2016.12.27 an bug cost me more than 7 hours!!!!!
*  
*  ATTENTION!!!!
*  Mongoose会自动给集合名加“s”
*  var Admin = mongoose.model('Admin’,userShema); 
*  比如这个model('Admin’,userShema)中的Admin映射到Mongodb里就是admins
*  所以如果集合名为Admin,读取数据始终为空,改成Admins就好了!!!!!FUCK!!!!
*
*/

module.exports = Admin;
//route
var express = require('express');
var router = express.Router();
var Admin = require('../data/models/admin');

/* GET admin page. */
router.get('/', function(req, res, next) {
  res.render('admin');
});

/* 处理登录 */
router.post('/login', function(req, res, next) {
  Admin.find({}, function(err, docs) {
  	if(err) {
  		console.log("err");
  	}else {
  		console.log(docs);//打印结果始终为 []
  	}
  })
});

module.exports = router;
以上就是三部分主要代码,route中的console.log(docs)始终打印空数组,检查了很多地方,没有任何问题,也百度了很多,一开始可能百度方式不对,,,后来百度到mongoose在创建model的时候,会自动添加s,如上述代码中的标红字体所示。所以其实一直读取的是admins集合,但是并没有这个集合,只有admin,最后把admin集合改名admins就好了。。。

真是神奇的特性,,,好生气,,,


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值