首頁 > web前端 > js教程 > Node.js的MongoDB驅動Mongoose基本上使用教學_node.js

Node.js的MongoDB驅動Mongoose基本上使用教學_node.js

WBOY
發布: 2016-05-16 15:12:43
原創
1780 人瀏覽過

使用mongoose可以讓我們更好地使用mongodb資料庫,而不需要寫繁瑣的業務邏輯。

安裝

npm install mongoose
登入後複製

初始化使用
使用mongoose前,需安裝node和mongodb,這裡不講node和mongodb的安裝方法。

 var mongoose = require("mongoose");
 var Schema = mongoose.Schema;
 var db = mongoose.connection;
 mongoose.connect('mongodb://localhost/animal');
 db.on('error', console.error);
 db.once('open', function() {
  //这里建立模式和模型
 }
登入後複製

快速入門
在mongoose中,所有的資料都是一種模式,每個模式都會對應到mongodb的集合,並且定義該集合檔案結構。

 //这里建立一个动物的模式,所有动物都拥有这个模式下的所有属性
 var animalSchema = new Schema({
  name: String,
  age: Number,
 });
登入後複製

模型是我們從Schema定義的一種多樣化的建構函數,模型的實例可以使用很多操作,所有文件的建立和檢索都是由模型來處理

 var animalMode = db.model('Animal', animalSchema);
登入後複製

模型的實例實質是文件,而我們可以很輕鬆地建立、修改這種文件

 var cat = new animalMode({
  name: 'catName',
  age: '7', //这里依然使用字符串,mongoose会自动转换类型
  });

 cat.save(function(err, thor) {
  if (err) return console.log(err);
  console.log(thor);
 });
 //或者可以使用create
 //cat.create(function(err, thor) {
 // if (err) return console.log(err);
 // console.log(thor);
 //});

 //执行查找
 animalMode.find(function(err, people){
  if(err) console.log(err);
  console.log(people);
 });
 //查找符合条件数据
 animalMode.findOne({title: 'catName'}, function(err, cat){
  if(err) console.log(err);
  console.log(cat);
 });

登入後複製

Schema
資料型別

這是Schema中所有的資料類型,包括mongoose自定的資料類型

  • String
  • Number
  • Date
  • Buffer
  • Boolean
  • Mixed
  • ObjectId
  • Array

每種資料類型的使用

 var animalMode = mongoose.model('Animal', schema);

 var cat = new animalMode;
 cat.name = 'Statue of Liberty'    //String
 cat.age = '7';        //Number
 cat.updated = new Date;      //Date
 cat.binary = new Buffer(0);     //Buffer
 cat.living = false;       //Boolean
 cat.mixed = { any: { thing: 'i want' } }; //Mixed    
 cat._someId = new mongoose.Types.ObjectId; //ObjectId
 cat.ofString.push("strings!");    //Array

登入後複製

其中Mixed是mongoose自訂的混合型,因為Mixed沒有定義具體內容,可以用{}來使用,以下2種定義形式等價。

 var animalSchema = new Schema({any: {}});
 var animalSchema = new Schema({any: {Schema.Types.Mixed}});
登入後複製

自訂方法

可以為Schema綁定方法

 var animalSchema = new Schema({
  name: String,
  age: Number,
 });

 animalSchema.methods.findSimilarTypes = function (cb) {
  return this.model('Animal').find({ name: this.name }, cb);
 }

 var animalMode = db.model('Animal', animalSchema);

 cat.findSimilarTypes(function(err, cat){
  if(err) console.log(err);
  console.log(cat);
 });

登入後複製

也可以為Schema加入靜態方法

 animalSchema.statics.findByName = function (name, cb) {
  return this.find({ name: new RegExp(name, 'i') }, cb);
 }
 var animalMode = db.model('Animal', animalSchema);

 animalMode.findByName('catName', function (err, animals) {
  console.log(animals);
 });

登入後複製

索引

我們可以為mongodb資料建立索引,mongodb支援二級索引,為了提高資料查找和定位,建立複合索引是必要的

 var animalSchema = new Schema({
  name: String,
  age: Number,
  tags: { age: [String], index: true } // field level
 });

 animalSchema.index({ name: 1, age: -1 }); // schema level

登入後複製

但這種索引的建立可能導致顯著的效能影響,建議在生產下停止,將設定模式下的自動索引設為false禁止

 animalSchema.set('autoIndex', false);
 // or
 new Schema({..}, { autoIndex: false });
登入後複製

Model
C

 cat.save(function(err, thor) {
  if (err) return console.log(err);
  console.log(thor);
 });
 //或者可以使用create
 cat.create(function(err, thor) {
  if (err) return console.log(err);
  console.log(thor);
 });
登入後複製

R

//find
animalMode.find(function(err, cat){
 if (err) console.log(err);
 console.log(cat);
})

//findOne
animalMode.findOne({name: 'catName'}, function(err, cat){
 if (err) console.log(err);
 console.log(cat);
})

//findByID
//与 findOne 相同,但它接收文档的 _id 作为参数,返回单个文档。_id //可以是字符串或 ObjectId 对象。
animalMode.findById(id, function(err, adventure){
 if (err) consoel.log(err);
 console.log(adventure);
});

//where
//查询数据类型是字符串时,可支持正则
animalMode.where('age', '2').exec(function(err, cat){
 if (err) console.log(err);
 console.log(cat);
});

animalMode
 .where('age').gte(1).lte(10)
 .where('name', 'catName')
 .exec(function(err, cat){
  if (err) console.log(err);
  console.log(cat);
 });

登入後複製

U
官方文件提供的更新函數Model.update

Model.update(conditions, doc, [options], [callback])

  • conditions 更新條件
  • doc 更新內容
  • option 更新選項
  • safe (boolean) 安全模式,預設選項,值為true
  • upsert (boolean) 條件不符時是否建立新文檔,預設值為false
  • multi (boolean) 是否更新多個文件,預設值為false
  • strict (boolean) 嚴格模式,只更新一條資料
  • overwrite (boolean) 覆蓋數據,預設為false
  • callback
  • err 更新資料出錯時回傳值
  • numberAffected (筆者暫時不清楚)
  • rawResponse 受影響的行數
animalMode.update({name: 'catName'}, {age: '6'}, {multi : true}, function(err, numberAffected, raw){
 if (err) return console.log(err);
 console.log('The number of updated documents was %d', numberAffected);
 console.log('The raw response from Mongo was ', raw);
});
登入後複製

D

animalMode.remove({age: 6}, function(err){
 if (err) console.log(err);
})
登入後複製

其它
//回傳文檔數

animalMode.count({age: 2}, function(err, cat){
 if (err) console.log(err);
 console.log(cat);
})
登入後複製

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板