Mongoose提供了一个直观的、基于模式(schema)的解决方案,可以为你的应用数据使用内置的类型转换、验证、查询和业务逻辑来建模。本文简述在Node.js中使用Mongoose连接MongoDB的方法。
1. 启动MongoDB
系统为CentOS 6.6。详细的mongodb server安装方法请参考:Mongo – Class One
首先添加repo,通过yum来安装。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# vim /etc/yum.repos.d/mongo.repo [10gen] name=10gen Repository baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64 gpgcheck=0 enabled=1 # yum install mongodb-org-server mongodb-org-mongos mongodb-org-shell 设置参数。 # vim /etc/mongod.conf logpath=/var/log/mongodb/mongod.log logappend=true fork=true //# fork and run in background dbpath=/var/lib/mongo pidfilepath=/var/run/mongodb/mongod.pid bind_ip=127.0.0.1,debugo01 |
在启动脚本中,已经设置了指定mongod用户来启动mongod,相关的数据目录也修改了权限。可以直接通过mongod来启动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# vim /etc/init.d/mongod ...... MONGO_USER=mongod MONGO_GROUP=mongod ...... # ll -d /var/lib/mongo/ drwxr-xr-x 2 mongod mongod 4096 Jan 14 07:15 /var/lib/mongo/ # service mongod start Starting mongod: [ OK ] # mongo > show dbs; admin (empty) local 0.078GB test (empty) |
2. 使用mongoose
内网服务器设置了代理:
npm install mongoose
注意,如果没有安装gcc, gcc-c++, make等编译器和构建工具,就会导致依赖包bson的native library不能正确编译,并在加载mongoose或mongodb时报错:node.js – Failed to load c++ bson extension, using pure JS version – Stack Overflow。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ vim mongoose_test.js var mongoose = require('mongoose') mongoose.connect('mongodb://localhost/test') var Cat = mongoose.model('Cat', {name : String}); var Kitty = new Cat({name : 'hi'}) Kitty.save(function (err) { if (err) //... console.log('meow') }); // 执行脚本 $ node mongoose_test.js |
检查test数据库,cats集合已经被自动创建。
1 2 3 4 5 |
$ mongo connecting to: test ..... > db.cats.findOne(); { "_id" : ObjectId("54c36c533b3d4bf942ff16f7"), "name" : "hi", "__v" : 0 } |
可以对连接设置一个回调函数,在连接成功(open)或发生错误时执行。
1 2 3 4 |
var db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); db.once('open', function (callback) { console.log('Connection established!')}); |
3. Mongoose的模式
在Mongoose中,所有都衍生于Schema。Schema中可以定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
var ExampleSchema = new Schema({ name:String, binary:Buffer, living:Boolean, updated:Date, age:Number, mixed:Schema.Types.Mixed, //该混合类型等同于nested _id:Schema.Types.ObjectId, //主键 _fk:Schema.Types.ObjectId, //外键 array:[], arrOfString:[String], arrOfNumber:[Number], arrOfDate:[Date], arrOfBuffer:[Buffer], arrOfBoolean:[Boolean], arrOfMixed:[Schema.Types.Mixed], arrOfObjectId:[Schema.Types.ObjectId] nested:{ stuff:String, } }); |
下面给出一个定义Kittens的参考。
1 2 3 |
var kittySchema = mongoose.Schema({ name: String }) |
该schema中定义了一个属性name,接下来把该schema编译为model。
1 |
var Kitten = mongoose.model('Kitten', kittySchema) |
model是我们建立文档的类。在这个例子中,每一个文档会是我们定义的带着属性的kitten对象。
1 2 |
var kitten = new Kitten({ name: 'kitten' }) console.log(kitten.name) // 'kitten' |
现在kitten就可以喵喵叫了,我们看一下如何对该对象添加一个speak功能。Javascript中?:表达式和C语言语法类似。
1 2 3 4 5 6 7 |
kittySchema.methods.speak = function () { var greeting = this.name "Meow name is " + this.name : "I don't have a name" console.log(greeting); } var Kitten = mongoose.model('Kitten', kittySchema) |
greeting函数添加到通过编译到Model原型的schema的methods属性中,每一个文档实例都可以调用该函数
1 2 |
var meow = new Kitten({ name: 'meow meow ' }); meow.speak() // "Meow name is meow meow" |
但是直到现在为止,我们并没有保存任何数据到MongoDB中,任何文档都需要调用它的save方法才能将它保存到数据库中。第一个参数是一个回调函数,当发生错误时会调用它。
1 2 3 4 |
meow.save(function (err, meow) { if (err) return console.error(err); meow.speak(); }); |
下面找到所有Kitten model下的文档。
1 2 3 4 5 6 7 |
var callback = function (err, kittens) { if (err) return console.error(err); console.log(kittens) } Kitten.find(callback) Kitten.find({name : /meow/}, callback) //[ { _id: 54c395b371d6322945df113f, name: 'meow meow', __v: 0 } ] |
要你更深刻的记住你主子的味道,哪天你走失了或者你主子走失了,你可以靠着味道来找到它
视频地址news***cntv***cn***2015***10***18***VIDE1445125587346370***shtml***ptag=vsogou