使用Mongoose

版权所有,禁止匿名转载;禁止商业使用。

Mongoose提供了一个直观的、基于模式(schema)的解决方案,可以为你的应用数据使用内置的类型转换、验证、查询和业务逻辑来建模。本文简述在Node.js中使用Mongoose连接MongoDB的方法。


1. 启动MongoDB


系统为CentOS 6.6。详细的mongodb server安装方法请参考:Mongo – Class One


首先添加repo,通过yum来安装。


Shell


# 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来启动


# 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。


JavaScript


$ 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集合已经被自动创建。


JavaScript


$ mongo
connecting to: test
.....
> db.cats.findOne();
{ "_id" : ObjectId("54c36c533b3d4bf942ff16f7"), "name" : "hi", "__v" : 0 }

可以对连接设置一个回调函数,在连接成功(open)或发生错误时执行。


Shell


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中可以定义:


JavaScript


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的参考。


JavaScript


var kittySchema = mongoose.Schema({
    name: String
})

该schema中定义了一个属性name,接下来把该schema编译为model。


JavaScript

var Kitten = mongoose.model('Kitten', kittySchema)

model是我们建立文档的类。在这个例子中,每一个文档会是我们定义的带着属性的kitten对象。


JavaScript


var kitten = new Kitten({ name: 'kitten' })
console.log(kitten.name) // 'kitten'

现在kitten就可以喵喵叫了,我们看一下如何对该对象添加一个speak功能。Javascript中?:表达式和C语言语法类似。


JavaScript


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属性中,每一个文档实例都可以调用该函数


JavaScript


var meow = new Kitten({ name: 'meow meow ' });
meow.speak() // "Meow name is meow meow"

但是直到现在为止,我们并没有保存任何数据到MongoDB中,任何文档都需要调用它的save方法才能将它保存到数据库中。第一个参数是一个回调函数,当发生错误时会调用它。


JavaScript


meow.save(function (err, meow) {
  if (err) return console.error(err);
  meow.speak();
});

下面找到所有Kitten model下的文档。


JavaScript


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 } ]


0 0