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 相关文章推荐
js png图片(有含有透明)在IE6中为什么不透明了
Feb 07 Javascript
javascript 动态修改样式和层叠样式表代码
Apr 27 Javascript
基于jquery自己写tab滑动门(通用版)
Oct 30 Javascript
动态加载jquery库的方法
Feb 12 Javascript
jQuery焦点控制图层展示延迟隐藏的方法
Mar 09 Javascript
表单验证正则表达式实例代码详解
Nov 09 Javascript
bootstrap模态框实现拖拽效果
Dec 14 Javascript
Bootstrap CSS组件之大屏幕展播
Dec 17 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
Dec 27 Javascript
vue基于Vue2.0和高德地图的地图组件实例
Apr 28 Javascript
微信小程序url传参写变量的方法
Aug 09 Javascript
JavaScript鼠标悬停事件用法解析
May 15 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
php 字符过滤类,用于过滤各类用户输入的数据
2009/05/27 PHP
php中创建和调用webservice接口示例
2014/07/25 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
基于php双引号中访问数组元素报错的解决方法
2018/02/01 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
JavaScript 内置对象属性及方法集合
2010/07/04 Javascript
jquery一般方法介绍 入门参考
2011/06/21 Javascript
浅析JavaScript原型继承的陷阱
2013/12/03 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
Javascript实现网络监测的方法
2015/07/31 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
20分钟轻松创建自己的Bootstrap站点
2016/05/12 Javascript
js变量提升深入理解
2016/09/16 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
原生js编写2048小游戏
2017/03/17 Javascript
JavaScript获取时区实现过程解析
2020/09/24 Javascript
Python三级目录展示的实现方法
2016/09/28 Python
virtualenv实现多个版本Python共存
2017/08/21 Python
详解PyCharm安装MicroPython插件的教程
2019/06/24 Python
python中while和for的区别总结
2019/06/28 Python
Python3 JSON编码解码方法详解
2019/09/06 Python
java关于string最常出现的面试题整理
2021/01/18 Python
论文评语大全
2014/04/29 职场文书
《中国梦我的梦》中学生演讲稿
2014/08/20 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
纪念九一八事变演讲稿:勿忘国耻
2014/09/14 职场文书
安全承诺书格式范本
2015/04/28 职场文书
2015年手术室工作总结
2015/05/11 职场文书
2015年行风建设工作总结
2015/05/15 职场文书
2015年新农村建设工作总结
2015/05/22 职场文书
培训计划通知
2015/07/15 职场文书
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android