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 相关文章推荐
一段多浏览器的&quot;复制到剪贴板&quot;javascript代码
Mar 27 Javascript
DHTML Slide Show script图片轮换
Mar 03 Javascript
Prototype源码浅析 String部分(四)之补充
Jan 16 Javascript
JavaScript调用客户端的可执行文件(示例代码)
Nov 28 Javascript
Event altKey,ctrlKey,shiftKey属性解析
Dec 18 Javascript
jQuery实现鼠标可拖动调整表格列宽度
May 26 Javascript
jQuery 和 CSS 的文本特效插件集锦
Dec 12 Javascript
JS简单实现仿百度控制台输出信息效果
Sep 04 Javascript
BootStrap Tooltip插件源码解析
Dec 27 Javascript
JS简单获取日期相差天数的方法
Apr 24 Javascript
javascript实现计算指定范围内的质数示例
Dec 29 Javascript
基于better-scroll 实现歌词联动功能的代码
May 07 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/08/14 PHP
php好代码风格的阶段性总结
2016/06/25 PHP
thinkphp项目如何自定义微信分享描述内容
2017/02/20 PHP
PHP实现时间日期友好显示实现代码
2019/09/08 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
2016/11/09 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
2017/06/29 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
使用JavaScript破解web
2018/09/28 Javascript
Vue动态路由缓存不相互影响的解决办法
2019/02/19 Javascript
详解vue 命名视图
2019/08/14 Javascript
详解Python中的strftime()方法的使用
2015/05/22 Python
解析Python编程中的包结构
2015/10/25 Python
python机器学习库常用汇总
2017/11/15 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
python使用knn实现特征向量分类
2018/12/26 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
树莓派实现移动拍照
2019/06/22 Python
Python PIL库图片灰化处理
2020/04/07 Python
利用python生成照片墙的示例代码
2020/04/09 Python
python logging模块的使用
2020/09/07 Python
10个示例带你掌握python中的元组
2020/11/23 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
Tiqets荷兰:出售欧洲最美丽的景点和博物馆门票
2018/01/09 全球购物
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
建筑工程专业毕业生自荐信
2013/10/19 职场文书
初中美术教学反思
2014/01/29 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
Python实现文本文件拆分写入到多个文本文件的方法
2021/04/18 Python
Python中tkinter的用户登录管理的实现
2021/04/22 Python