mongodb 的使用以及出现db.collection is not a function报错

当使用MongoDB时遇到'db.collection is not a function'错误,可能是因为升级到3.0版本后API发生了改变。解决方法是先通过client.db获取父对象,再调用db.collection。此外,介绍了数据更新和查找的方法,包括条件筛选、字段更新、分页和排序。还提到了MongoDB的常用命令,如mongod启动数据库,show dbs列出数据库,以及如何插入和查询数据。最后讨论了在Node.js中使用session的应用及其配置。

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

当出现db.collection is not a function报错时,原因是mongo版本升级为3.0以后api发生变化。
3.0:
回调函数返回的是访问对象的父对象。所以要
let db = client.db(‘forum’);
之后再访问数据库对象:
db.collection(‘forum’)

// 建立数据库
var MongoClient = require('mongodb').MongoClient;
//链接数据库
function _connectDB(callback) {
	let url = 'mongodb://127.0.0.1:27017/forum';
	MongoClient.connect(url, { useNewUrlParser: true }, function(err, client){
		
		if(err){
			callback(err, client);
			return;
		}
		callback(err, client)
	})
}
init(); // 初始化
function init(){
	_connectDB((err, client) => {
		if(err) {
			console.log(err);
			return;
		}
		let db = client.db('forum');
		db.collection('forum').createIndex({'username': 1}, null, (err, result) => {
			console.log('创建索引')
			client.close();
		})
	})
}

数据更新
json1:筛选条件
json2:更新哪些字段 参数2需要使用 KaTeX parse error: Expected '}', got 'EOF' at end of input: …on.username}, {set: {
‘username’: fields.username
}}, callback)
参数3:如果没有筛选到符合条件的记录,是否需要将参数2插入到集合中,默认false,不插入
参数4:默认false,一次更新一条;true一次更新多条,此时参数2需要使用$set操作

exports.updateMany = function(collectionName, json1, json2, callback){
	_connectDB((err, client) => {
			let db = client.db('forum);
			db.collection(cpllectionName).updateMany(json1, json2, (err, result) => {
				if(err){
					callback(err, null);
					client.close();
					return;
				} else {
					callback(null, result);
					client.close();
				}
			)
``		})
	})
}`

数据查找:
先判定有几个参数
// limit:限制每次查找几条信息
//skip:跳过n条显示
//sort:排序方式(+1 / -1)

exports.find = function(collectionName, json, argumentC, argumentD){
	// 因为arguments的数量时可变的,不确定的。所以先判断参数的个数 3个或者4个
	if(arguments.length === 3){
		// 那么此时没有参数D
		var callback = argumentC;
		var skipNumber = 0; // 用于跳页
		var limit = 0; // 限制每页的数量
	} else if(arguments.length === 4){
		var callback = argumentD;
		var args = argumentC; // 将argumentC作为json传参
		// 省略的条数 = 每页显示的数量*页数
		var skipNumber = args.pageamount * args.page || 0;
		var limit = args.pageamount || 0;
		var sort = args.sort || {}; // 排序方式
	} else {
        throw new Error("find函数的参数个数,必须是3个,或者4个。");
        return;
    }
	
	_connectDB((err, client) => {
		let db = client.db('forum');

		let result = []; //设置接受结果的数组
	// limit:限制每次查找几条信息
	//skip:跳过n条显示
	//sort:排序方式(+1 / -1)
		let rel = db.collection(collectionName).find(json).limit(limit).skip(skipNumber).sort(sort); 
		rel.each((err, doc) => {
			// console.log(doc)
			if(err){
				callback(err, null);
				client.close();
				return;
			}
			// console.log(doc)
			if(doc != null){
				result.push(doc); // 循环遍历文档,将所有的文档都保存到结果数组中
			} else {
				callback(null, result); // 将结果返回
				client.close();
			}
		})

		// rel.forEach((val, index, arr) => {
		// 	if(val != null){
		// 		result.push(val);
		// 		callback(null, result);
		// 		client.close();	
		// 	} else  {
		// 		callback(null, result);
		// 		client.close();
		// 	}
		// })
	})
	
}

查找所有的数量
// count({}):全部
//count({‘username’: ‘aaa’}): 有条件的查找

// 得到所有comment的数量
exports.getCount = function(collectionName, json, callback){
	_connectDB((err, client) => {
		let db = client.db('forum');
		db.collection(collectionName).count(json).then((count) => {
			if(err){
				callback(err, null);
				client.close();
				return;
			}
			callback(null, count);
			client.close();
		})
	})
}

数据库 mondodb 命令
mongod --dbpath d:\mongo 开机数据库
另一个cmd :mongo 链接数据库
show dbs: 累出所有数据库
use databaseName: 使用数据库,如果没有则新建一个
db.databaseName.find() :查询该数据库下的所有
db.databaseName。insert({‘username’:‘zhagnsan’,"age’:38}) :插入数据

session应用 成为全局变量
一定要写在res.send()之前
req.session.login = 3;
req.session.username = fields.username;
读取:
req.session.login
req.session.username

在app处配置session
//配置session
app.use(session({
secret: ‘keyboard cat’,
resave: false,
saveUninitialized: true,
cookie : {
maxAge : 1000 * 60 * 3, // 设置 session 的有效时间,单位毫秒
},
}));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值