Node.js的Mongodb使用实例


Posted in Javascript onDecember 30, 2016

安装mongodb模块 npm install --save mongodb

数据库连接

var MongoClient = require('mongodb').MongoClient;
var assert = require('assert');

//连接test数据库
var url = 'mongodb://localhost:27017/test';
MongoClient.connect(url, (err,db) => {
 assert.equal(null,err);
 console.log('连接成功');
 db.close();
});

插入数据

插入一个文档对象

var MongoClient = require('mongodb').MongoClient;
var assert = require('assert');

//test数据库的路径
var url = 'mongodb://localhost:27017/test';

//插入文档
var insertDocument = (db,callback) => {
 //在test库下blog集合中 新增json文档
 db.collection('blog').insertOne({
  name:"xiaos",
  age:22
 }, (err, result) => {
  assert.equal(err,null);
  console.log('新增文档成功');
  callback();
 });
};

 
//插入操作
MongoClient.connect(url, (err,db) => {
 assert.equal(null,err);
 insertDocument(db, ()=>{
  db.close();
 });
});

批量插入操作:insertMany(doc,options,callback)(如果没有callback函数,本身返回一个Promise对象)

简单的insertMany操作

var MongoClient = require('mongodb').MongoClient,
 test = require('assert');

MongoClient.connect('mongodb://localhost:27017/test',(err, db) => {
 var blog = db.collection('blog');
 //新增两个文档对象
 blog.insertMany([{name:"shen"},{name:"fzq"}],(err,r) => {
  test.equal(null,err);
  //回调函数中返回的r为执行完插入操作的对象,insertedCount属性为已经插入的对象个数
  test.equal(2,r.insertedCount);
  db.close();
 });
});

使用Promise的批量插入操作!

var MongoClient = require('mongodb').MongoClient,
 test = require('assert');
MongoClient.connect('mongodb://localhost:27017/test', (err,db) => {
 var blog = db.collection('blog');
 blog.insertMany([{name:"xiaosGG"},{name:"fzqDD"}]).then((r) => {
  test.equal(2,r.insertedCount);
  db.close();
 });
});

因为mongodb和nodejs都是异步io的机制,所有几乎所有耗时的操作都是以回调函数的方式完成。但是因为回调函数的层次嵌套,一段代码后面可能会跟上一大段的 });,随着层级的增加,代码变得不易理解和维护。所有在使用MongoDB时,推荐用Promise的方式来解决回调嵌套的问题。

 从上面的代码可以看出,insertMany([obj...])返回一个Promise对象,我们用.then((r)=>{})接收正常的回调值,用.catch((err) => {})来抓取异常。

使用生成器(Generator)的批量插入操作

var MongoClient = require('mongodb').MongoClient,
 test = require('assert'),
 co = require('co');
 
co(function*(){
 var db = yield MongoClient.connect('mongodb://localhost:27017/test');
 var blog = db.collection('blog');
 var r = yield blog.insertMany([{name:"xiaosBB"},{name:"fzqMM"}]);
 test.equal(2,r.insertedCount);
 db.close();
});

单个文档插入:insertOne(doc,options,callback)(如果没有callback函数,本身返回一个Promise对象)

简单的插入操作

var MongoClient = require('mongodb').MongoClient,
 test = require('assert');
MongoClient.connect('mongodb://localhost:27017/test',(err,db)=>{
 var blog = db.collection('blog');
 blog.insertOne({name:"xiaos"},(err,r) => {
  test.equal(null,err);
  test.equal(1,r.insertedCount);
  db.close();
 });
});

使用Promise的插入操作

var MongoClient = require('mongodb').MongoClient,
 test = require('assert');
MongoClient.connect('mongodb://localhost:27017/test',(err,db)=>{
 var blog = db.collection('blog');
 blog.insertOne({name:"xiaos"}).then((r)=>{
  test.equal(1,r.insertedCount);
  db.close();
 });
});

使用生成器的插入操作

var MongoClient = require('mongodb').MongoClient,
 test = require('assert'),
 co = require('co');
 
co(function*(){
 var db = yield MongoClient.connect('mongodb://localhost:27017/test');
 var blog = db.collection('blog');
 var r = yield blog.insertOne({name:"xiaosBB"});
 test.equal(1,r.insertedCount);
 db.close();
});

mapReduce(map,reduce,options,callback) return Promise if no callback

var MongoClient = require('mongodb').MongoClient,
 test = require('assert');

MongoClient.connect()

isCapped(callback) return Promise if no callback

var MongoClient = require('mongodb').MongoClient,
 test = require('assert');
MongoClient.connect('mongodb://localhost:27017/test',(err,db) => {
 db.createCollection('newBlog',{'capped':true,'size':1024},(err,collection) => {
  test.equal('newBlog',collection.collectionName);  
  collection.isCapped((err,capped) => {
   test.equal(true,capped);
   db.close();
  });
 });
});

capped collection是指固定大小的集合,新元素插入后会覆盖掉旧的元素,保持整个集合的大小不变。

//在命令行中输入mongo
//创建一个1024大小的myCappedCollection集合
db.createCollection('myCappedCollection',{'capped':true,'size':1024});
//插入1000条记录
for (var i = 1;i <= 1000;i++){
 db.myCappedCollection.save({id:i,name:'xiaos'+i});
}
//查询文档个数
db.myCappedCollection.count()
//实际只有18个文档id为983-1000 即新元素覆盖了旧元素

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript检查日期格式的函数[比较全]
Oct 17 Javascript
JQuery AJAX实现目录浏览与编辑的代码
Oct 21 Javascript
JavaScript 在各个浏览器中执行的耐性
Apr 06 Javascript
JavaScript效率调优经验
Jun 04 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
Jan 06 Javascript
javascript中arguments,callee,caller详解
Mar 16 Javascript
Javascript 跨域知识详细介绍
Oct 30 Javascript
浅谈Vue.js
Mar 02 Javascript
javaScript日期工具类DateUtils详解
Dec 08 Javascript
深入理解js A*寻路算法原理与具体实现过程
Dec 13 Javascript
Vue数字输入框组件示例代码详解
Jan 15 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
May 06 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
Dec 30 #Javascript
原生JS实现图片左右轮播
Dec 30 #Javascript
零基础轻松学JavaScript闭包
Dec 30 #Javascript
Html5+jQuery+CSS制作相册小记录
Dec 30 #Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
Dec 30 #Javascript
bootstrap表格分页实例讲解
Dec 30 #Javascript
js中数组的常用方法小结
Dec 30 #Javascript
You might like
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
php实现递归的三种基本方式
2020/07/04 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
PHP命名空间定义与用法实例分析
2019/08/14 PHP
Laravel获取所有的数据库表及结构的方法
2019/10/10 PHP
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
微信小程序使用gitee进行版本管理
2018/09/20 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
NodeJs操作MongoDB教程之分页功能以及常见问题
2019/04/09 NodeJs
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
JavaScript实现消消乐的源代码
2021/01/12 Javascript
在Python的web框架中配置app的教程
2015/04/30 Python
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
mac系统安装Python3初体验
2018/01/02 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
python利用proxybroker构建爬虫免费IP代理池的实现
2021/02/21 Python
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
英国标志性生活方式品牌:Skinnydip London
2019/12/15 全球购物
你经历的项目中的SCM配置项主要有哪些?什么是配置项?
2013/11/04 面试题
教师见习期自我鉴定
2014/04/28 职场文书
素质教育标语
2014/06/27 职场文书
2014年城管个人工作总结
2014/12/08 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
导游词之珠海轮廓
2019/10/25 职场文书
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript
Python&Matlab实现樱花的绘制
2022/04/07 Python