Mongoose使用案例--让JSON数据直接入库MongoDB
目录
一、准备工作
使用Express4创建项目,ejs作为视图引擎。
二、配置Mongoose
1、安装Mongoose类库:npm install mongoose --save。
2、创建models文件夹,在models文件夹下新建mongodb.js文件。
var mongoose=require('mongoose');
mongoose.connect('mongodb://localhost:27017/nodejs');
exports.mongoose=mongoose;
三、创建目录及文件
1、在models目录,创建数据模型Movie.js,也就是我们通常想扮演的Dao角色。
var mongodb=require('./mongodb');
var Schema=mongodb.mongoose.Schema;
var MovieSchema=new Schema({
name:String,
alias:[String],
publish:Date,
create_date:{type:Date,default:Date.now},
images:{
converSmall:String,
converBig:String
},
source:[{
source:String,
link:String,
swfLink:String,
quality:String,
version:String,
lang:String,
subtitle:String,
create_date:{type:Date,default:Date.now}
}]
});
var Movie=mongodb.mongoose.model("Movie",MovieSchema);
var MovieDao=function(){};
/*******
保存
********/
MovieDao.prototype.save=function(obj,callback){
var instance=new Movie(obj);
instance.save(function(err){
callback(err);
})
}
/**
按照电影名称精确查询
**/
MovieDao.prototype.findByName=function(name,callback){
Movie.findOne({name:name},function(err,obj){
callback(err,obj);
});
}
module.exports=new MovieDao();
2、打开app.js 完善路由地址
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var movie=require('./routes/movie');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
//app.use('/', routes);
//app.use('/users', users);
app.get('/',movie.movieAdd);
app.get('/movie/add',movie.movieAdd);
app.post('/movie/add',movie.doMovieAdd);
app.get('/movie/:name',movie.movieAdd);
app.get('/movie/json/:name',movie.movieJson);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
module.exports = app;
app.listen(3000,function(){
console.log('server begin...');
})
3、在routes目录增加movie.js
var Movie=require('./../models/Movie.js');
exports.movieAdd=function(req,res){
if(req.params.name){
return res.render("movie",{
title:req.params.name+'|电影|管理|movie.me',
label:'编辑电影'+req.params.name,
movie:req.params.name
});
}else{
return res.render("movie",{
title:'新增加|电影|管理|movie.me',
label:'新增加电影',
movie:false
});
}
}
exports.doMovieAdd=function(req,res){
console.log(JSON.parse(req.body.content));
var json=JSON.parse(req.body.content); //把客户端的Json字符串转化为object
if(json._id){
//update
}
else{
//insert
Movie.save(json,function(err){
if(err){
res.send({'success':false,'err':err})
}else{
res.send({'success':true})
}
})
}
}
exports.movieJson=function(req,res){
Movie.findByName(req.params.name,function(err,obj){
res.send(obj);
})
}
4、在views目录,增加movie.ejs视图。
<% include head.ejs %>
<div class="container-fluid">
<div class="row-fluid">
<div class="span8">
<form>
<fieldset>
<legend><%=label%></legend>
<textarea name="editor" id="editor" class="span12" rows="10" cols="60" <%=(movie?'"movie='+movie+'"':'')%> ></textarea>
</fieldset>
<br>
<button id="save" type="button" class="btn btn-primary">保存</button>
</form>
</div>
</div>
</div>
<span id='msg'></span> <% include footer.ejs %>
运行起来看看页面效果 http://localhost:3000

四、插入数据,POST提交JSON增加一条记录
1、基础环境搭建好后,别忘了启动mongodb服务。在这里还有个地方,如果你使用的是express4.0框架,那么从页面向路由里传对象时需要在客户端里用JSON.Stringify序列化对象,然后在路由文件里使用JSON.Parse把字符串转化为对象。本地直接创建一个JSON对象,直接读取这个JSON文件插入数据库。在public/javascripts下创建movie.json。
创建好JSON文件后,我在本地使用了head.ejs和footer.ejs ,别忘了在footer.ejs里引用要使用的js文件,我这里使用了jquery、bootstrap、jquery.json、movie.js(后面创建)。
{
"name": "未来警察",
"alias": ["Future X-Cops ","Mei loi ging chaat"],
"publish": "2010-04-29",
"images":{
"coverBig":"/img/movie/1_big.jpg",
"coverSmall":"/img/movie/1_small.jpg"
},
"source":[{
"source":"优酷",
"link":"http://www.youku.com",
"swfLink":"http://player.youku.com/player.php/sid/XMTY4NzM5ODc2/v.swf",
"quality":"高清",
"version":"正片",
"lang":"汉语",
"subtitle":"中文字幕"
},{
"source":"搜狐",
"link":"http://tv.sohu.com",
"swfLink":"http://share.vrs.sohu.com/75837/v.swf&topBar=1&autoplay=false&plid=3860&pub_catecode=",
"quality":"高清",
"version":"正片",
"lang":"汉语",
"subtitle":"中文字幕"
}]
}
2、在public/javascripts目录里增加movie.js作为客户端访问脚本。 客户端初始化时读取json文件。
$(function(){
var mdata={};
var url='/javascripts/movie.json';
var movie=$('#editor').attr('movie');
if(movie){
url='/movie/json/'+movie;
}
$.getJSON(url,function(data){
mdata=data;
render_editor_form(data);
render_event_form();
});
var render_editor_form=function(data){
$('#editor').val($.toJSON(data));
};
var render_event_form=function(){
$('#save').on('click',function(event){
var data={};
data.content=JSON.stringify(mdata);
$.ajax({
type:'POST',
url:'/movie/add',
dataType:'json',
data:data,
success:function(data,status){
if(data.success){
$('#msg').html('保存成功');
$('#msg').addClass('href','/movie/'+data.name);
}else{
$('#msg').html(data.err);
$('#msg').addClass('alert alert-error');
}
}
});
});
};
});
启动浏览器看看效果:

3、在models目录增加Movie.js 也就是我们操作数据库的地方,增加save()。
/*******
保存
********/
MovieDao.prototype.save=function(obj,callback){
var instance=new Movie(obj);
instance.save(function(err){
callback(err);
})
}
4、在routes/movie.js里调用save()
exports.doMovieAdd=function(req,res){
console.log(JSON.parse(req.body.content));
var json=JSON.parse(req.body.content); //把客户端的Json字符串转化为object
if(json._id){
//update
}
else{
//insert
Movie.save(json,function(err){
if(err){
res.send({'success':false,'err':err})
}else{
res.send({'success':true})
}
})
}
}
页面启动起来,直接点击保存按钮,查看报文,插入成功后会返回success:true。插入成功后你可以用DOS命令来检查,也可以用可视化工具来查看,后面在页面里调用也可以。
五、查询数据,取出你插入数据库的记录
1、在models/Movie.js里增加findByName()用来查看你刚才插入数据库的记录,这里使用电影名称来查看。
/**
按照电影名称精确查询
**/
MovieDao.prototype.findByName=function(name,callback){
Movie.findOne({name:name},function(err,obj){
callback(err,obj);
});
}
2、在routes/movie.js里调用findByName()
exports.movieJson=function(req,res){
Movie.findByName(req.params.name,function(err,obj){
res.send(obj);
})
}
写完调用后,你可以在浏览器里输入http://localhost:3000/movie/json/未来警察 ,会返回你刚才入库的数据。

总结
使用Mongodb我发现最灵活的莫过于数据结构了,原文是用的express3,然后我做的时候用的express4,在路由里使用req.body.content提示undefined。后来查询因为Express版本的时,所以就用了JSON.Stringify和JSON.parse()。
原文地址:http://blog.fens.me/nodejs-mongoose-json/
Mongoose使用案例--让JSON数据直接入库MongoDB的更多相关文章
- MongoDB 将Json数据直接写入MongoDB的方法
Json转Bson MongoDB中是以Bson数据格式进行存储的,Json字符串没有办法直接写入MongoDB 可以将Json字符串转换成DBObject或者Document,然后写入MongoDB ...
- 10.MongoDB:将Json数据直接写入MongoDB的方法
Json转Bson MongoDB中是以Bson数据格式进行存储的,Json字符串没有办法直接写入MongoDB 可以将Json字符串转换成DBObject或者Document,然后写入MongoDB ...
- kettle批量导入json数据
kettle新手上路,烦死了,工具好用,批量导入数据也快,就是有很多小细节需要注意. 使用kettle进行数据导入时,因为最近在做json数据的入库,以JSON Input为例进行说明: 首先是大概流 ...
- 【clickhouse专栏】对标mongodb存储类JSON数据文档统计分析
一.文档存储的需求 很多的开发者都使用过mongodb,在mongodb中数据记录是以文档的形式存在的(类似于一种多级嵌套SQL的形式).比如下面的JSON数据结构:dev_ip表示某一台服务器的ip ...
- ajax请求json数据案例
今天有这样一个需求,点击六个大洲,出现对应的一些请求信息,展示在下面,请求请求过后,第二次点击就无需请求.如图所示:点击北美洲下面出现请求的一些数据 html代码结构: <div class=& ...
- jQuery实例之ajax请求json数据案例
今天有这样一个需求,点击六个大洲,出现对应的一些请求信息,展示在下面,请求请求过后,第二次点击就无需请求.如图所示:点击北美洲下面出现请求的一些数据 html代码结构: <div class=& ...
- android基础---->JSON数据的解析
上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...
- Android中Json数据读取与创建
一: Json的特性和在数据交互中的地位就不用说了,直接看案例. 首先在android studio中创建assets文件目录,用于存放Json数据文件,android studio 1.3 默认项 ...
- Android(java)学习笔记208:Android中操作JSON数据(Json和Jsonarray)
1.Json 和 Xml JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的 ...
随机推荐
- nginx 启动不了的小问题
nginx 配置的端口可能没打开 linux打开端口: /sbin/iptables -I INPUT -p tcp --dport 8011 -j ACCEPT #开启8011端口 /etc/ ...
- .NET Core 跨平台发布(dotnet publish)
.NET Core 跨平台发布(dotnet publish) ,无需安装.NET Core SDK,就可以运行. 前面讲解了.NET Core 的VSCode 开发.现在来讲讲发布(dotnet p ...
- js问题杂记
1.如何把字符串数组 转成数组对象? eval妙用 var str = "[\"UserName=1,Pwd=1\",\"UserNmae=1,Pwd=1,Sa ...
- DRY(Don't Repeat Yourself )原则
凡是写过一些代码的程序猿都能够意识到应该避免重复的代码和逻辑.我们通过提取方法,提取抽象类等等措施来达到这一目的.我们总能时不时的听到类似这样的话:”把这些公用的类放到shared项目去,别的项目还要 ...
- 剑指Offer面试题:6.用两个栈实现队列
一.题目:用两个栈实现队列 题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 原文是使用 ...
- log4j.xml的实用例子
大多数讲log4j配置的教程用的都是log4j.properties文件,我觉得xml或许更好一点,在这里我提供一个我已经用于生产环境的log4j.xml的例子,先上代码,然后再解释: <?xm ...
- 【java并发编程实战】-----线程基本概念
学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...
- 程序猿尤其是.NET程序员所需要注意的网站资源
我觉得一个程序员 需要 对 技术 和 行业 两方面同时具有极大热情和注意力才能让自己在一个新的台阶. 有些程序员就是对技术有着极大的热情但是行业完全不注意,这样我感觉只能成为一个专家,并不能让自己真正 ...
- Hystrix框架2--超时
timeout 在调用第三方服务时有些情况需要对服务响应时间进行把控,当超时的情况下进行fallback的处理 下面来看下超时的案例 public class CommandTimeout exten ...
- Java this的一两点使用
Java this的一两点使用 之前的文章都是关于Android的使用,这次想写一些关于Java的知识,总结一下Java的使用.这次写的是关于Java this的使用,介绍以下内容: this的概念 ...