Mongo基础使用,以及在Express项目中使用Mongoose
<h2>MongoDB的基本使用</h2><h3>MongoDB特点:</h3>
<ul>
<li>使用BSON存储数据</li>
<li>支持相对丰富的查询操作(相对其他nosql数据库)</li>
<li>支持索引</li>
<li>副本集(支持多个实例/多个服务器运行同个数据库)</li>
<li>分片(数据库水平扩展)</li>
<li>无模式(同个数据文档中的数据可以不一样)</li>
<li>部署简单方便(默认无密码,也带来安全问题)</li>
</ul>
<h3>服务的启动:</h3>
<div class="cnblogs_code">
<pre>mongod</pre>
</div>
<p>(此前需要安装了mongo数据库,并创建过mongodb的目录:$ mkdir -p /data/db)</p>
<p>启动mongodb后,可以使用mongo命令行来操作数据库,或使用Robomongo这样的GUI客户端。</p>
<h3>Mongo命令行工具操作MongoDB:</h3>
<p>使用一个数据库:(mongodb不需要预先创建数据库,当给一个数据库写入内容时会自动创建)</p>
<div class="cnblogs_code">
<pre>$ use mytest</pre>
</div>
<p><span style="color: rgba(51, 153, 102, 1)">插入数据<strong>:</strong></span>(给mytest数据库下的users集合插入一条文档)</p>
<div class="cnblogs_code">
<pre>$ db.users.insert({"username": "nuanfeng"})</pre>
</div>
<p>然后可以查看数据库和集合:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ show dbs
$ show collections</span></pre>
</div>
<p><span style="color: rgba(51, 153, 102, 1)">查看</span>users集合中的所有文档:</p>
<div class="cnblogs_code">
<pre>$ db.users.find()</pre>
</div>
<p>再添加一条数据:(mongodb是无模式的,所以可以添加不同格式的数据)</p>
<div class="cnblogs_code">
<pre>$ db.users.insert({"username": "Zoe", "group": "reporter"})</pre>
</div>
<p>再用db.users.find()查看,如下:</p>
<p><img src="https://images2015.cnblogs.com/blog/776126/201612/776126-20161210171500163-1808741902.png" alt="" width="583" height="280"></p>
<p><br>查看数据的数量:</p>
<div class="cnblogs_code">
<pre>$ db.users.find().count()</pre>
</div>
<p>根据id<span style="color: rgba(51, 153, 102, 1)">查询</span>数据:</p>
<div class="cnblogs_code">
<pre>$ db.users.find({"_id": ObjectId("584bc73ea635e489676cf5db")})</pre>
</div>
<p><span style="color: rgba(51, 153, 102, 1)">更新</span>数据: (匹配到的第一条)</p>
<div class="cnblogs_code">
<pre>$ db.users.update({"username": "Zoe"}, {$set: {"group": "writer"}})</pre>
</div>
<p>更新数据: (匹配到的所有)</p>
<div class="cnblogs_code">
<pre>$ db.users.update({"username": "Zoe"}, {$set: {"group": "writer"}}, {multi: true})</pre>
</div>
<p>用save()也可以<span style="color: rgba(51, 153, 102, 1)">修改</span>数据:(必须根据‘_id’,会直接替换掉原来的数据)</p>
<div class="cnblogs_code">
<pre>db.users.save({"_id": ObjectId("584bc73ea635e489676cf5db"), "group": "reporter"})</pre>
</div>
<p><span style="color: rgba(51, 153, 102, 1)">删除</span>满足条件的所有:</p>
<div class="cnblogs_code">
<pre>$ db.users.remove({"group": "reporter"});</pre>
</div>
<p>删除满足条件的第一条:</p>
<div class="cnblogs_code">
<pre>$ db.users.remove({"group": "reporter"}, true);</pre>
</div>
<p>删除集合中的所有文档:</p>
<div class="cnblogs_code">
<pre>$ db.users.remove({})</pre>
</div>
<p>删除整个集合(所有文档和索引)</p>
<div class="cnblogs_code">
<pre>$ db.users.drop()</pre>
</div>
<p> </p>
<h2>使用Mongoose模块操作MongoDB</h2>
<h3>模块介绍</h3>
<p>Mongoose是将nodejs的对象和MongoDB中的文档对应的一个模块。</p>
<p>Mongoose既支持强模式,也支持无模式。</p>
<p>安装mongoose:</p>
<div class="cnblogs_code">
<pre>$ npm install mongoose</pre>
</div>
<p>先看一下最终的目录结构:</p>
<h3>配置与链接</h3>
<p>链接的格式:(也可以省略用户名、密码、端口号)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> uri = 'mongodb://username:password@hostname:port/databasename'<span style="color: rgba(0, 0, 0, 1)">
mongoose.connect(uri);</span></pre>
</div>
<h3>Model与Schema</h3>
<p>Model使nodejs对象和MongoDB中的文档相对应,<span style="color: rgba(51, 153, 102, 1)">Schema</span>实现了Model的数据类型和结构的定义,从而在无模式的MongoDB中实现了<span style="color: rgba(51, 153, 102, 1)">模式化的存储</span>。</p>
<p><strong>model.js</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">* 配置并链接MongoDB *</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> mongoose = require('mongoose'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> uri = 'mongodb://localhost/mongoose-base'<span style="color: rgba(0, 0, 0, 1)">;
mongoose.connect(uri);
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">* 创建Schema、创建Model *</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> BookSchema = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> mongoose.Schema({
name: String,
author: String,
publishTime: Date
});
mongoose.model(</span>'Book', BookSchema);</pre>
</div>
<h3>创建文档</h3>
<p><strong>insert.js</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> mongoose = require('mongoose'<span style="color: rgba(0, 0, 0, 1)">);
require(</span>'./model.js'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">* 获取Model,创建Book的实例 Entity *</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> Book = mongoose.model('Book'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> book = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Book({
name: </span>'MEAN Web Develop'<span style="color: rgba(0, 0, 0, 1)">,
author: </span>'Green'<span style="color: rgba(0, 0, 0, 1)">,
publishTime: </span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Date()
});
book.author </span>= 'Jim'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 参数可以重新指定</span>
<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">* 插入数据 *</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
book.save(</span><span style="color: rgba(0, 0, 255, 1)">function</span>(err) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 执行保存,并查看返回情况</span>
console.log('save status:', err ? 'failed' : 'success'<span style="color: rgba(0, 0, 0, 1)">);
})</span></pre>
</div>
<h3>简单查询</h3>
<p><strong>find.js</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> mongoose = require('mongoose'<span style="color: rgba(0, 0, 0, 1)">);
require(</span>'./model.js'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> Book = mongoose.model('Book'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">* 查询所有数据 *</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
Book.find({}, </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(err, docs) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (err) {
console.log(</span>'err:'<span style="color: rgba(0, 0, 0, 1)">, err);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
}
console.log(docs)
})</span></pre>
</div>
<p><strong>findOne.js</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> mongoose = require('mongoose'<span style="color: rgba(0, 0, 0, 1)">);
require(</span>'./model.js'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> Book = mongoose.model('Book'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">* 查询一条数据,并修改 *</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
Book.findOne({author: </span>'Jim'}, <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(err, doc) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (err) {
console.log(</span>'err:'<span style="color: rgba(0, 0, 0, 1)">, err);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
}
doc.author </span>= 'James'<span style="color: rgba(0, 0, 0, 1)">;
doc.save();
console.log(</span>'findOne result:'<span style="color: rgba(0, 0, 0, 1)">, doc)
})</span></pre>
</div>
<h3>删除文档</h3>
<p><strong>remove.js</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> mongoose = require('mongoose'<span style="color: rgba(0, 0, 0, 1)">);
require(</span>'./model.js'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> Book = mongoose.model('Book'<span style="color: rgba(0, 0, 0, 1)">);
Book.findOne({ author: </span>'Jim' }, <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(err, doc) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (err) {
console.log(</span>'findOne err:'<span style="color: rgba(0, 0, 0, 1)">, err);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (doc) {
doc.remove();
}
})</span></pre>
</div>
<h3>条件语句</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> mongoose = require('mongoose'<span style="color: rgba(0, 0, 0, 1)">);
require(</span>'./model.js'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> Book = mongoose.model('Book'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> cond =<span style="color: rgba(0, 0, 0, 1)"> {
$or: [
{author: </span>'Jim'<span style="color: rgba(0, 0, 0, 1)">},
{author: </span>'James'<span style="color: rgba(0, 0, 0, 1)">}
]
};
Book.find(cond, </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(err, docs){
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(err) {
console.log(</span>'find by cond err:'<span style="color: rgba(0, 0, 0, 1)">, err);
}
console.log(</span>'cond:', cond, 'result:'<span style="color: rgba(0, 0, 0, 1)">, docs);
})</span></pre>
</div>
<p> </p>
<h2>在Express项目中使用Mongoose</h2>
<h3>快速生成express应用</h3>
<p>这里我们用express-generator来快速生成express应用(先安装好node、npm、express-generator、mongodb)</p>
<div class="cnblogs_code">
<pre>$ express mongooseExpress</pre>
</div>
<p>先看下最终的项目结构图:</p>
<p><img src="https://images2015.cnblogs.com/blog/776126/201612/776126-20161210231144569-407900451.png" alt="" width="525" height="312"></p>
<h3>配置数据库并连接</h3>
<p>新建config文件夹,用来放置数据库配置信息</p>
<p><strong>config/config.js</strong></p>
<div class="cnblogs_code">
<pre>module.exports =<span style="color: rgba(0, 0, 0, 1)"> {
mongodb: </span>'mongodb://localhost:27017/mongoose-test'<span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p><strong>config/mongoose.js</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> mongoose = require('mongoose'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> config = require('./config.js'<span style="color: rgba(0, 0, 0, 1)">);
module.exports </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">() {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> db =<span style="color: rgba(0, 0, 0, 1)"> mongoose.connect(config.mongodb);
require(</span>'../models/user.server.model.js'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> db;
}</span></pre>
</div>
<h3>全局引入mongoose</h3>
<p>在app.js的路由模块前引用刚才创建的mongoose配置信息(8,9两行)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 255, 1)">var</span> express = require('express'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 255, 1)">var</span> path = require('path'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 255, 1)">var</span> favicon = require('serve-favicon'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 255, 1)">var</span> logger = require('morgan'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 255, 1)">var</span> cookieParser = require('cookie-parser'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)">var</span> bodyParser = require('body-parser'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 255, 1)">var</span> mongoose = require('./config/mongoose.js'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 255, 1)">var</span> db =<span style="color: rgba(0, 0, 0, 1)"> mongoose();
</span><span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 255, 1)">var</span> index = require('./routes/index'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">var</span> users = require('./routes/users'); </pre>
</div>
<h3>创建Schema和Model</h3>
<p>新建models文件夹</p>
<p><strong>/models/user.server.model.js</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> mongoose = require('mongoose'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> UserSchema = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> mongoose.Schema({
uid: Number,
username: String,
createTime: Date,
lastLogin: Date
});
mongoose.model(</span>'User', UserSchema);</pre>
</div>
<h3>编写数据库处理逻辑代码</h3>
<p>我们直接在users路由模块中加入数据库存取操作的代码</p>
<p><strong>/routes/users.js</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 255, 1)">var</span> express = require('express'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 255, 1)">var</span> router =<span style="color: rgba(0, 0, 0, 1)"> express.Router();
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 255, 1)">var</span> mongoose = require('mongoose'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 255, 1)">var</span> User = mongoose.model('User'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> GET users listing. </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> router.get('/', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(req, res, next) {
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> res.send('respond with a resource'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">});
</span><span style="color: rgba(0, 128, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">12</span> router.get('/test', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(req, res, next) {
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 255, 1)">var</span> user = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> User({
</span><span style="color: rgba(0, 128, 128, 1)">14</span> uid: 1<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">15</span> username: 'nuanfeng'
<span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)"> })
</span><span style="color: rgba(0, 128, 128, 1)">17</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> user.save(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(err){
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(err) {
</span><span style="color: rgba(0, 128, 128, 1)">20</span> res.end('Error'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> next();
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">23</span>
<span style="color: rgba(0, 128, 128, 1)">24</span> User.find({}, <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(err, docs) {
</span><span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(err) {
</span><span style="color: rgba(0, 128, 128, 1)">26</span> res.end('Error'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> next();
</span><span style="color: rgba(0, 128, 128, 1)">28</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">29</span>
<span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 0, 0, 1)"> res.json(docs);
</span><span style="color: rgba(0, 128, 128, 1)">31</span> <span style="color: rgba(0, 0, 0, 1)"> })
</span><span style="color: rgba(0, 128, 128, 1)">32</span> <span style="color: rgba(0, 0, 0, 1)"> })
</span><span style="color: rgba(0, 128, 128, 1)">33</span> <span style="color: rgba(0, 0, 0, 1)">})
</span><span style="color: rgba(0, 128, 128, 1)">34</span>
<span style="color: rgba(0, 128, 128, 1)">35</span> module.exports = router;</pre>
</div>
<h3>运行node查看效果</h3>
<div class="cnblogs_code">
<pre>$ node bin/www</pre>
</div>
<p>然后在浏览器中访问:http://localhost:3000/users/test,就能往数据库中存入一条记录,并在当前页面返回它的json数据</p><br><br>
来源:https://www.cnblogs.com/woodk/p/6155955.html
頁:
[1]