一.基本概念
- MongoDB中的
Collection
就相当于Mysql 中的table
,Collection中的Document
就相当于table中的row
。 - mongoose中的
Model
类似于JavaScript中的类,提供了许多的函数,方便对数据库进行操作,Document
就是Model的一个实例,Schema
给Model定型,规定Model需要包含哪些东西,而Query
是命令,相当于一条sql语句,告诉数据库要做什么。
二.实例分析
1.以Model
的APIfindById
为例
findById
返回一个<<Query>>, 也就是说如果你只是调用这个函数的话,如
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
mongoose.connect(
'mongodb://localhost:5000/test',
{
useNewUrlParser: true
}
);
mongoose.connection.on('open', () => {
console.log('Connected to MongoDB');
});
mongoose.connection.on('error', () => {
console.log('Failed to connect to MongoDB');
process.exit(-1);
});
const schema = new Schema({
name: {
type: String,
required: true
}
});
const User = mongoose.model('user', schema);
async function main() {
//console.log(await User.create({ name: 'User1' }));
let query = User.findById('5bf113de76a9230bcebdf8e2');
console.log(query);
}
main();
这时候console.log(user1)
会发现user1
只是一个Query而已
Query {
_mongooseOptions: {},
_transforms: [],
mongooseCollection:
NativeCollection {
collection: null,
opts:
{ bufferCommands: true,
capped: false,
'$wasForceClosed': undefined },
name: 'users',
collectionName: 'users',
即User.findById()
是你定义好的一个命令,让数据库根据你传入的Id
返回你需要的Document, 但是你还没有执行这个命令,当然它现在就只是一个Query而已。
执行的办法有三种:
- 使用回调函数
// executes immediately, passing results to callback
User.findById('5bf113de76a9230bcebdf8e2', function (err, doc) {
console.log(doc);
});
输出结果
{ _id: 5bf113de76a9230bcebdf8e2, name: 'User1', __v: 0 }
- 调用Query自带的exec(callback)执行
let query = User.findById('5bf113de76a9230bcebdf8e2');
query.exec(function(err, doc) {
console.log(doc);
});
- 使用await,因为一个Query默认是一个Promise, Query调用exec()后,如果没有传递callback函数,也默认返回一个Promise
let user1 = await User.findById('5bf113de76a9230bcebdf8e2');
console.log(user1);
或
let user1 = await User.findById('5bf113de76a9230bcebdf8e2').exec();
console.log(user1);
网友评论