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 相关文章推荐
快速保存网页中所有图片的方法
Jun 23 Javascript
jQuery实现div浮动层跟随页面滚动效果
Feb 11 Javascript
表单提交前触发函数返回true表单才会提交
Mar 11 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
May 10 Javascript
AngularJS中watch监听用法分析
Nov 04 Javascript
jQuery表格的维护和删除操作
Feb 03 Javascript
JavaScript省市级联下拉菜单实例
Feb 14 Javascript
JS实现的简单图片切换功能示例【测试可用】
Feb 14 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
Apr 04 jQuery
vue点击input弹出带搜索键盘并监听该元素的方法
Aug 25 Javascript
js array数组对象操作方法汇总
Mar 18 Javascript
ES5新增数组的实现方法
May 12 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打造属于自己的MVC框架
2012/03/07 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
PHP小白必须要知道的php基础知识(超实用)
2017/10/10 PHP
使用AngularJS来实现HTML页面嵌套的方法
2015/06/17 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
JavaScript实现瀑布流布局
2020/06/28 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
webpack external模块的具体使用
2018/03/10 Javascript
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
2019/04/24 Javascript
Vue实现剪切板图片压缩功能
2020/02/04 Javascript
如何使用gpu.js改善JavaScript的性能
2020/12/01 Javascript
windows下Virtualenvwrapper安装教程
2017/12/13 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
Linux系统(CentOS)下python2.7.10安装
2018/09/26 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
Python检测数据类型的方法总结
2019/05/20 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
django使用JWT保存用户登录信息
2020/04/22 Python
python 实现端口扫描工具
2020/12/18 Python
Bootstrap 学习分享
2012/11/12 HTML / CSS
欧洲顶级体育电子商务网站:SportsShoes.com
2018/03/27 全球购物
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
经济与贸易专业应届生求职信
2013/11/19 职场文书
社区禁毒工作方案
2014/06/02 职场文书
幼儿教师师德师风演讲稿
2014/08/22 职场文书
奥巴马经典演讲稿
2014/09/13 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书
HTML+VUE分页实现炫酷物联网大屏功能
2021/05/27 Vue.js
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android