非常详细的文档http://mongodb.github.io/node-mongodb-native/2.2/quick-start/quick-start/

连接数据库

安装express 和 mongodb .

npm install express mongodb --save

通过 MongoClient.connect(url, function(err, db) {}) API 连接

'use strict';
const express = require("express"),
mongoClient = require("mongodb").MongoClient;
var app = express(),
url = 'mongodb://localhost:27017/test'; app.listen(3000, function(err) {
if (err) {
console.log("has error");
}
});
app.get("/", function(req, res) {
mongoClient.connect(url, function(err, db) {
if (err) {
console.log("数据库连接失败")
}
res.send("连接成功");
db.close();
})
})

这样就连接成功了 .

用ES6 还是更棒的, 不过觉得配babel 比较麻烦.., 等到结尾的dao 层封装我会使用ES6的语法来完成

插入数据

提供了两个api,分别为 db.collection("student").insertOne() & db.collection("student").insertMany

app.get("/", function(req, res) {
mongoClient.connect(url, function(err, db) {
if (err) {
console.log("数据库连接失败")
}
db.collection("student").insertOne({ "name": "筱原明里", "age": "18" }, function(err, result) {
if (err) {
console.log(err);
}
res.send(result);
}) db.collection("student").insertMany([{ "name": "远野贵树", "age": "18" }, { "name": "澄田花苗" }], function(err, result) {
if (err) {
console.log(err);
}
res.send(result);
}) db.close();
})
})

查找和分页

通过db.collection().find() 会返回一个游标,通过游标的迭代来访问所有数据.

注意,each 迭代的过程是异步的 !

app.get("/", function(req, res) {
mongoClient.connect(url, function(err, db) {
if (err) {
console.log("数据库连接失败")
}
var collection = db.collection('student'),
cursor = collection.find({}),
result = [];
cursor.each(function(err, doc) {
console.log(doc)
if (err) {
console.log(err);
}
if (doc == null) {
res.send(result);
}else{
result.push(doc);
}
});
db.close();
})
})

但是通过each判断是否迭代完成并不是很好的方式,mongo给这个游标赋予一个更好的方法 toArray

app.get("/", function(req, res) {
mongoClient.connect(url, function(err, db) {
if (err) {
console.log("数据库连接失败")
}
var collection = db.collection('student'),
cursor = collection.find({}); cursor.toArray(function(err, docs) {
// docs 就是所有的文档
console.log(docs);
})
db.close();
})
})

这样做是取出全部的数据,下面是分页查询呢

mongoDB 的分页查询非常方便,封装的skip,limit 有点像 .net 中的 EF中的skip,take 等方法.

app.get("/", function(req, res) {
mongoClient.connect(url, function(err, db) {
if (err) {
console.log("数据库连接失败")
}
var collection = db.collection('student'),
// 跳过5条再取5条
cursor = collection.find({}).skip(10).limit(5); cursor.toArray(function(err, docs) {
// docs 就是所有的文档
console.log(docs);
})
db.close();
})
})

实际当然不能这么写,稍后会封装一个DAO,在里面会使用参数进行分页

修改

app.get("/", function(req, res) {
mongoClient.connect(url, function(err, db) {
if (err) {
console.log("数据库连接失败")
}
db.collection('student').updateOne({ name: "远野贵树" }, { $set: { age: 20, gender: "男" } }, function(err, result) {
if (err) {
console.log(err);
} else {
console.log(result);
}
})
db.collection('student').updateMany({ name: "澄田花苗" }, { $set: { age: 20, gender: "女" } }, function(err, result) {
if (err) {
console.log(err);
} else {
res.send(result);
}
})
db.close();
})
})

删除

删除同样包含两个api ,deleteMany & deleteOne.

app.get("/", function(req, res) {
mongoClient.connect(url, function(err, db) {
if (err) {
console.log("数据库连接失败")
}
db.collection("student").deleteOne({ 'name': '澄田花苗' }, function(err, result) {
res.send(result);
}) db.collection("student").deleteMany({ 'name': '澄田花苗' }, function(err, result) {
res.send(result);
})
db.close();
})
})

DAO 封装

每次像上面一样调用肯定是不可行的,所以需要封装一个DAO层.

mongodbdao.js

/*
* @Author: Administrator
* @Date: 2017-03-13 17:14:40
* @Last Modified by: Administrator
* @Last Modified time: 2017-03-13 20:24:23
*/ 'use strict';
const mongoClient = require("mongodb").MongoClient,
dburl = require("config").dburl; // 连接数据库,内部函数
function _connectDB(callback) {
mongoClient.connect(dburl, function(err, db) {
if (err) {
console.log(err);
return;
}
callback(err, db);
}
})
} exports.find = function(collectionName, json, pageOption, callback) {
// 第 0 页,就跳过 0 条,第 1 页,跳过10条 ,取 10条
// skip & limit ,如果参数为0,那么就忽略参数
var skipNumber = pageOption.page * pageOption.count || 0,
takeNumber = pageOption || 0,
sort = pageOption.sort || {};
_connectDB(function(err, db) {
db.collection(collectionName).find(json).skip(skipNumber).limit(takeNumber).sort(sort) toArray(function(err, docs) {
callback(err, docs);
db.close();
});
})
}; exports.insertOne = function(collectionName, json, callback) {
_connectDB(function(err, db) {
db.insertOne(collectionName).insertOne(function(err, res) {
callback(err, res);
db.close();
})
})
}
exports.insertMany = function(collectionName, json, callback) {
_connectDB(function(err, db) {
db.insertOne(collectionName).insertMany(function(err, res) {
callback(err, res);
db.close();
})
})
} exports.deteleOne = function(collectionName, json, callback) {
_connectDB(function(err, db) {
db.collection(collectionName).deteleOne(json, function(err, res) {
callback(err, res);
db.close();
})
})
}; exports.deteleMany = function(collectionName, json, callback) {
_connectDB(function(err, db) {
db.collection(collectionName).deteleMany(json, function(err, res) {
callback(err, res);
db.close();
})
})
}; exports.updateOne = function(collectionName, jsonQeury, jsonSet, callback) {
_connectDB(function(err, db) {
db.collection(collectionName).updateOne(jsonQeury, { $set: jsonSet }, function(err, res) {
callback(err, res);
db.close();
})
})
}; exports.updateMany = function(collectionName, jsonQeury, jsonSet, callback) {
_connectDB(function(err, db) {
db.collection(collectionName).updateMany(jsonQeury, { $set: jsonSet }, function(err, res) {
callback(err, res);
db.close();
})
})
};
exports.getAllCount = function(collectionName, json, callback) {
_connectDB(function(err, db) {
db.collection(collectionName).count(json, function(err, count) {
callback(err, count);
db.close();
})
})
};

简单地完成了一个DAO 的封装,但是在项目中, 也是不会这样用的

因为有一个更强大的东西 mongooose,它就相当于 EF 之于 ADO.NET.

mongoDB & Nodejs 访问mongoDB (二)的更多相关文章

  1. mongoDB & Nodejs 访问mongoDB (一)

    最近的毕设需要用到mongoDB数据库,又把它拿出来再学一学,下盘并不是很稳,所以做一些笔记,不然又忘啦. 安装 mongoDB & mongoVUE mongoDB: https://www ...

  2. MongoDB最简单的入门教程之二 使用nodejs访问MongoDB

    在前一篇教程 MongoDB最简单的入门教程之一 环境搭建 里,我们已经完成了MongoDB的环境搭建. 在localhost:27017的服务器上,在数据库admin下面创建了一个名为person的 ...

  3. 使用nodejs 访问mongodb

    我使用了 express 框架 目录结构 db.js 文件 function connectionDB(hostname, port) { //注释地方暂时没有使用.是把官方代码照抄下来 // var ...

  4. 使用 MongoDB shell访问MongoDB

  5. NodeJS+Express+MongoDB

    一.MongoDB MongoDB是开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序丰富:高伸缩性:MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言 ...

  6. MongoDB最简单的入门教程之五-通过Restful API访问MongoDB

    通过前面四篇的学习,我们已经在本地安装了一个MongoDB数据库,并且通过一个简单的Spring boot应用的单元测试,插入了几条记录到MongoDB中,并通过MongoDB Compass查看到了 ...

  7. 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南

    1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...

  8. 使用Spring访问Mongodb的方法大全——Spring Data MongoDB

    1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...

  9. nodejs学习笔记二——链接mongodb

    a.安装mongoose库用来链接mongodb数据库 安装mongodb数据库参考mongodb安装 前言(怨言) 本来是想安装mongodb库来链接mongodb的,命令行到nodejs工程目录: ...

随机推荐

  1. 【js编程艺术】小制作六

    1.html /* movie.html*/<!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...

  2. SQL Server-聚焦SNAPSHOT基于行版本隔离级别详解(三十)

    前言 上一篇SQL Server详细讲解了隔离级别,但是对基于行版本中的SNAPSHOT隔离级别仍未完全理解,本节再详细讲解下,若有疑义或不同见解请在评论中提出,一起探讨. SNAPSHOT行版本隔离 ...

  3. Mac系统安装Aircrack-ng破解wifi密码(2)

    我们上一篇文章说过如何通过Aircrack-ng, 破解使用WPA/PSK加密方式的路由密码, 这一篇介绍的是使用Aircrack-ng破解使用WEP加密方式的路由密码: WEP和WPA/PSK的区别 ...

  4. Win10+Ubuntu16.04双系统安装

    硬件工具: 一台PC 一个U盘(8GB以上) Win10安装(已经装好Win10的小朋友们请无视): 准备工作: 下载Win10升级助手 保证系统盘有8GB以上剩余空间 安装步骤(由于安装过程中未记录 ...

  5. iOS实现白板、画板功能,有趣的涂鸦工具,已封装,简单快捷使用

    一.效果图: 二.选择颜色: 分[固定颜色模式]和[自由取模式].  三.操作栏功能: 1.撤销:撤销上一步操作,可一直往上进行,直到全部清空. 2.清空:直接清除所有绘画. 3.橡皮擦:去除不要的绘 ...

  6. AKKA学习笔记

    AKKA学习笔记总结 01. AKKA 1. 介绍: Akka基于Actor模型,提供了一个用于构建可扩展的(Scalable).弹性的(Resilient).快速响应的(Responsive)应用程 ...

  7. C++ cout 输出小数点后指定位数

    在C中我们可以使用 printf("%.2lf",a);但在C++中是没有格式操作符的,该如何操作: C++使用setprecision()函数,同时必须包含头文件iomanip, ...

  8. Socket.io+Nodejs通讯实例

    具体源码:Socket 目录结构 D:. │ package.json │ server.js │ └─public index.html socket.io.js 需要的条件 socket.io.j ...

  9. 纯js实现html转pdf

    项目开发中遇到了一个变态需求,需要把一整个页面导出为pdf格式,而且要保留页面上的所有的表格.svg图片和样式.简而言之,就是希望像截图一样,把整个页面截下来,然后保存成pdf.咋不上天呢--查了一下 ...

  10. 谈谈JavaScript代码混淆

    概述: 案例:Cesium打包流程,相关技术点和大概流程 原理:代码优化的意义:压缩 优化 混淆 优化:如何完善Cesium打包流程 关键字:Cesium gulp uglifyjs 字数:2330 ...