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 相关文章推荐
jquery将一个表单序列化为一个对象的方法
Jan 03 Javascript
表单序列化与jq中的serialize使用示例
Feb 21 Javascript
Javascript中With语句用法实例
May 14 Javascript
谈一谈javascript中继承的多种方式
Feb 19 Javascript
javascript history对象详解
Feb 09 Javascript
node.js入门学习之url模块
Feb 25 Javascript
javaScript中的空值和假值
Dec 18 Javascript
Vue组件和Route的生命周期实例详解
Feb 10 Javascript
Node.js中的不安全跳转如何防御详解
Oct 21 Javascript
elementUI多选框反选的实现代码
Apr 03 Javascript
js实现页面导航层级指示效果
Aug 25 Javascript
vue中的可拖拽宽度div的实现示例
Apr 08 Vue.js
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 if 想到的些问题
2008/03/22 PHP
php mssql 时间格式问题
2009/01/13 PHP
PHP删除特定数组内容并且重建数组索引的方法.
2011/03/25 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
jQuery Tools tab使用介绍
2012/07/14 Javascript
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
AngularJS日期格式化常见操作实例分析
2018/05/17 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
JS实现的tab页切换效果完整示例
2018/12/18 Javascript
JavaScript直接调用函数与call调用的区别实例分析
2020/05/22 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
[41:17]完美世界DOTA2联赛PWL S3 access vs CPG 第二场 12.13
2020/12/17 DOTA
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
python批量修改文件名的示例
2020/09/27 Python
Python threading模块condition原理及运行流程详解
2020/10/05 Python
事业单位公务员的职业生涯规划
2014/01/15 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
研修第一天随笔感言
2014/02/15 职场文书
奥运会口号
2014/06/13 职场文书
计划生育汇报材料
2014/12/26 职场文书
主持人大赛开场白
2015/05/29 职场文书
画错魏国疆域啦!《派对咖孔明》动画因作画失误于官网致歉
2022/04/07 日漫
win10如何更改appdata文件夹的默认位置?
2022/07/15 数码科技