学习是一个慢慢理解的过程,所以会不间断更新~
上次学习mongodb还是上个暑假,现在已经忘的差不多了,等于从零开始学习了,而网上了纯粹的例子太少了,经过最近的学习,将自己从零开始学习的过程记录下来
代码github地址:https://github.com/DQing/mongo-demo
资源:
ubuntu16.04
mongodb
Robomongo (mongodb可视化客户端,有ubuntu版本)
现在假定上面的资源你都已经安装好了。
连接mongodb
#connect.js
var mongoose = require("mongoose"); //需要提前使用npm安装mongodb
var url = "mongodb://127.0.0.1:27017/mongo"; //mongo是我的数据库
var db = mongoose.connect(url); //连接数据库
db.connection.on("error", function (error) {
console.log("数据库连接失败:" + error);
});
db.connection.on("open", function () {
console.log("数据库连接成功");
});
不出意外的话当你在终端运行node connect.js
,会输出“数据库连接成功”,这就说明我们的数据库已经可以成功连接上了。
创建数据库模型
在连接上数据库后,我们就得考虑我们想在数据库中存取哪些数据,它们的结构是怎样,这就需要我们去构建数据库模型了,如下:
#schema.js
var mongoose = require('mongoose');
var UserSchema = new mongoose.Schema({ //定义数据模型
name: String,
age: Number,
sex: String
});
mongoose.model('User', UserSchema);//将该Schema发布为Model
这一步就不需要在终端运行啦~
测试
现在我们就可以将前面定义的connect.js
文件和schema.js
联合起来进行测试
#index.js
var mongoose = require('mongoose');
require('./connect.js');
require('./schema.js');
var User = mongoose.model('User'); //User为model name
mongoose.Promise = global.Promise; //为了避免警告的出现,因为mongoose的默认promise已经弃用了
var user = new User({
name: 'douqing',
age:18,
sex:'女'
});
user.save(function (err) {
console.log('save status:', err ? 'failed' : 'success');
});
现在我们在终端输入node index.js
,就会出现
数据库连接成功
save status: success
在Robomongo查看会看到我的mongo数据库下有了users表,并且数据已经保存进去了
mongodb.png
图中_id
与_v
字段是系统自己添加的数据,其他的数据就和我们刚才在模型中定义的数据是完全一样的。
当然你也可以通过命令行在终端查看是否添加成功。
现在对于mongodb基本的操作就算成功啦~
其他方法应用(增删改查)
#index.js
var mongoose = require('mongoose');
require('./connect');
require('./schema.js');
var User = mongoose.model('User');//User为model name
mongoose.Promise = global.Promise;
var user = new User({
name: 'douqing',
age:18,
sex:'女'
});
user.save(function (err) { //增加
console.log('save status:', err ? 'failed' : 'success');
});
User.find({}, function (err,results) { //查找出数据库中所有数据
if(err){
console.log('error message',err);
return;
}
console.log('results',results);
});
User.findOne({name : 'douqing'},function (err, result) { //根据条件查找相应的数据
if(err){
console.log('error message:', err);
}
console.log('result', result); //输出name=‘douqing’的所有数据
});
User.findByIdAndUpdate('58ec4b0090c04916666ce203', {name: 'liji'}, //根据id查找对应数据并将name字段修改为‘liji’
function (err, result) {
if (err) {
console.log('error message:' + err);
}
console.log(result);
});
User.remove({name:'douqing'},function (err, result) { //删除name=‘douqing‘对应的数据
if (err){
console.log('error message:' + err);
}
console.log('remove success');
});
运行index.js
文件,即可在终端获得从数据库返回的数据。
更多API详解:http://mongoosejs.com/docs/api.html
较深层次理解
不知道大家对于上面的users表是如何产生的有没有疑问,当我在写代码时,并没有在任何地方指定或者创建users表。
经过查证发现原来是schema.js
文件中的mongoose.model('User', UserSchema)
在作鬼。
当我们没有指定表名时,系统默认会在name后面加s作为使用表名,所以这就可以解释为什么我们的表名是users(还会变成小写)
mongoose.model()方法可以有四个参数
- name:为模型model的名称
- schema:为mongodb的document映射的schema
- collection:为真正的collection名称
- skipInit:为是否跳过初始化,默认为false
那么现在我们可以将schema.js
文件修改成这样
var mongoose = require('mongoose');
var UserSchema = new mongoose.Schema({ //定义一个Schema
name: String,
age: Number,
sex: String
});
mongoose.model('User', UserSchema,'test',false);//这时我指定的表名为test
运行index.js
文件之后,在Robomongo上显示如下
希望这篇文章有帮助到你~
如果你有什么问题,可以在下面留言哦!
网友评论