mongoDB與mongoose

mongoDB簡介vue

mongoDB與一些關係型數據庫相比,它更顯得輕巧、靈活,很是適合在數據規模很大、事務性不強的場合下使用。同時它也是一個對象數據庫,沒有表、行等概念,也沒有固定的模式和結構,全部的數據以文檔的形式存儲。node

·由c++語言編寫,是一個分佈式文件存儲的開源NoSQL數據庫系統。在高負載的狀況下,添加更多的節點,能夠保證服務器性能。mysql

· mongoDB旨在爲web應用提供可擴展的高性能數據存儲解決方案c++

· mongoDB將數據存儲爲一個文檔,數據結構由鍵值對組成。mongoDB文檔相似於JSON對象,字段值能夠包含其餘文檔、數組及文檔數組。web

安裝  https:www.mongodb.org/download下載安裝包sql

安裝可視化工具,如robomongo、mongovue等mongodb

mongodb的啓動與鏈接數據庫

  - windows啓動服務器端 找到mongodb的安裝目錄(好比是D:\mongodb),shift+右鍵打開命令窗口,新建一個data文件夾,在命令行中輸入npm

    mongod --dbpath=D:\mongodb\datajson

    若是出現connections on port 27017就表示啓動成功並在27017端口上監聽了客戶端的請求。--dbpath後的值表示數據庫文件的存儲路徑,並且後面的路徑必須事先建立好,必須已經存在,不然服務開啓失敗。另外,這個命令窗體一旦關閉就至關於中止了mongodb的服務。

  - 啓動客戶端鏈接服務器 找到mongodb的安裝目錄,好比D:\mongodb\bin,在該目錄下打開命令行窗口,輸入mongo --host=127.0.0.1或者mongo,按回車鍵,其中--host後的值表示服務器的ip地址,127.0.0.1表示的是本地服務器,每次數據庫都會默認鏈接test數據庫

mongodb基本概念

  ·數據庫

    1,一個mongoDB能夠創建多個數據庫

    2,mongoDB的單個實例能夠容納多個獨立的數據庫,每個都有本身的集合和權限,不一樣的數據庫也放置在不一樣的文件中。

    3,數據庫也經過名字來標識,數據庫名能夠是知足一下條件的任意utf8字符串

      - 不能是空字符串

      - 不能含有空格、.、$、/、\和\0(空字符)

      - 應所有小寫

      - 最多64字節

    4, 有一些數據庫名是保留的,能夠直接訪問這些有特殊做用的數據庫

      - admin:’root‘數據庫,要是將一個用戶添加到這個數據庫,這個用戶自動繼承全部數據庫的權限,一些特定的服務器端命令也只能從這個數據庫運行,好比列出全部的數據庫或者關閉服務器

      - local:這個數據庫永遠不會被複制,能夠用來存儲於本地單臺服務器的任意集合

      - config:當mongoDB用於分片設置時,config數據庫在內部使用,用於保存分片的相關信息

  ·文檔(至關於row)

    文檔是mongoDB中的核心單元,能夠將文檔類比成關係數據庫中的每一行數據。多個鍵及其關聯的值有序的放置在一塊兒就是文檔。mongoDB使用了BSON這種結構來存儲數據和網絡數據交換。BSON數據能夠理解爲在JSON的基礎上添加了一些json中沒有的數據類型。

  ·集合(至關於table)

    集合就是一組文檔的組合,若是將文檔類比成數據庫中的行,那麼集合就能夠類比成數據庫的表。在mongoDB中的集合是無模式的,也就是說集合中存儲的文檔的結構能夠是不一樣的,好比下面的兩個文檔能夠同時存入到一個集合中

{"name":"lucy"}{"Name":"lily","sex":"女"}  注:當第一個文檔插入時,集合就會被建立

  ·字段field(至關於column)

對mongoDB的基礎操做

數據庫的方法 help

  ·建立數據庫 use database_name 注:若是數據庫不存在,則建立數據庫,不然切換到指定數據庫

  ·查看全部數據庫 show dbs 注:若是新建一個數據庫沒有顯示,則須要向新建的數據庫插入一些數據db.collection_name.insert({name:'zhangsan'})

  ·查看當前使用的數據庫 db或db.getName() 注:db表明的是當前數據庫

  ·刪除數據庫 db.dropDatabase()

  ·斷開mongodb與mongodb服務的鏈接 exit

操做集合方法 db.worker.help()查看幫助api

  ·查看當前數據庫下有哪些集合 show collections

  ·建立集合 db.createCollection("collection_name")

  ·向集合中插入文檔 db.collection_name.insert(document) 注:document指要插入的文檔

  ·查看集合中有多少條document數據 db.collection_name.count()

  ·刪除當前數據庫中的集合 db.collection_name.drop()

文檔的方法

  ·插入文檔 db.collection_name.insert(document) 插入文檔後會自動生成一個_id號,_id的類型是ObjectId類型的

   也能夠用數組的方式一次向集合中插入多條文檔db.collection_name.insert([document1,document2]) 

  ·查詢集合中的全部文檔 db.collection_name find()

  ·使用save方法插入文檔(插入或者更新),_id若是存在就更新,_id若是不存在就插入。用法與insert相似

  ·更新已經存在的文檔 db.collection_name.update(<query>,<update>,{upsert:<boolean>,multi:<boolean>,writeConcern:<document>})

    - query:update的查詢條件,相似sql update查詢的where後面的

    - update:update的對象和一些更新的操做符(如$set,$inc...),$inc在原基礎上累加後更新,$set直接更新

    - multi:可選,默認false,只更新找到的第一條記錄;若是爲true,就把按條件查出來的多條記錄所有更新

  eg: db.worker.update({name:'zhangsan'},{$set:{name:'zhangsan123'}})

擴展

  存儲在mongodb集合中的每一個文檔都有一個默認的主鍵_id,這個主鍵名稱是固定的,它能夠是mongodb支持的任何數據類型,默認是ObjectId。該類型的值由系統本身生成,從某種意義上說不會重複。mysql等關係型數據庫的主鍵都是自增的。但在分佈式環境下,這種方法不可行,會產生衝突。所以,mongoDB採用ObjectId的類型來作主鍵。Objectid是一個12字節的BSON類型字符串。

Mongoose

mongoose是mongoDB的一個對象模型工具,是基於node-mongodb-native開發的mongoDB的nodejs驅動,能夠在異步的環境下執行。同時它也是針對mongoDB操做的一個對象模型庫,封裝了mongoDB對文檔的一些增刪改查等經常使用方法,讓nodejs操做mongoDB數據庫變得更加容易。

·安裝mongoose

npm install mongoose

·引用mongoose

var mongoose = require('mongoose')

·使用mongoose鏈接數據庫

var db = mongoose.connect('mongodb://user:pass@localhost:port/database')

·執行下面代碼檢查默認數據庫test,是否能夠正常鏈接成功

//2 加載模塊
var mongoose = require("mongoose"); //3. 鏈接數據庫 mongod 服務器端 mongo客戶端 //數據庫的名稱能夠是不存在 建立一個zf數據庫
var db = mongoose.connect("mongodb://123.57.143.189:27017/zf"); //若是鏈接成功會執行error回調
db.connection.on("error", function (error) { console.log("數據庫鏈接失敗:" + error); }); //若是鏈接成功會執行open回調
db.connection.on("open", function () { console.log("數據庫鏈接成功"); }); //定義一個 schema,描述此集合裏有哪些字段,字段是什麼類型 //只有schema中有的屬性才能被保存到數據庫中
var PersonSchema = new mongoose.Schema({ name : { type:String }, home : { type:String }, age : { type:Number, default:0 }, time : { type:Date, default:Date.now }, email: { type:String,default:''} }); //建立模型,能夠用它來操做數據庫中的person集合,指的是總體
var PersonModel = db.model("person", PersonSchema); //根據模型建立實體,是指的個體對象
var personEntity = new PersonModel({ name : "zf", age : 6, email: "zf@qq.com", home:'beijing' }); //用save 方法把本身保存到數據庫中
personEntity.save(function(error,doc){ if(error){ console.log("error :" + error); }else{ console.log(doc); } });

若是要經過mongoose建立一個集合並對其進行增刪改查,就須要用到Schema(數據屬性模型)、Model、Entity

Schema簡述

這是一種以文件形式存儲的數據庫模型骨架,沒法直接通往數據庫端,也就是說它不具有對數據庫的操做能力,僅僅只是數據庫模型在程序片斷中的一種表現,能夠說是數據屬性模型(傳統意義的表結構),又或者是集合的模型骨架。基本屬性類型有字符串、日期型、數值型、布爾型、null、數組、內嵌文檔等。

定義一個Schema:

var PersonSchema = new monoose.Schema({ name:{type:String}, age:{type:Number,default:0} , time:{type:Date,default:Date.now}, email:{type:String,default:''} })

Model簡述

由Schema構造生成的模型,除了Schema定義的數據庫骨架之外,還具備數據庫操做的行爲,相似於管理數據屬性、行爲的類。

經過Schema建立Model

//建立模型,能夠用它來操做數據庫中的person集合,指的是總體。建立一個person集合
var PersonModel = db.model("person", PersonSchema);

person:數據庫中的集合名稱,當咱們對其添加數據時若是person已經存在,則會保存到其目錄下,若是未存在,則會建立person集合,而後再保存數據。有了model,也就有了操做數據的能力。建立一個Model模型,須要指定兩點:1,集合名稱;2,集合的Schema結構對象。知足這兩點,就能夠操做數據庫啦。

Entity簡述

由Model建立的實體,使用save方法保存數據,Model和Entity都有能影響數據庫的操做,但Model比Entity更具操做性。建立Entity成功後,Schema的屬性就變成了Model和Entity的公共屬性了。

使用Model建立Entity

//根據模型建立實體,是指的個體對象
var personEntity = new PersonModel({ name : "zf", age : 6, email: "zf@qq.com", home:'beijing' });

mongoose基礎操做

  ·查詢  

  查詢分爲多種類型,如條件查詢、過濾查詢等。obj.find(查詢條件,field,callback),field省略或爲null,則返回全部屬性;field中把須要顯示的屬性設置爲大於零的數則返回該屬性,_id不指定默認返回,設置_id爲0則不返回該屬性,其餘字段不指定,默認不返回

Model.find({},function(error,docs){ //若沒有向find傳遞參數,默認的是顯示全部文檔
})

查詢就是返回一個集合中文檔的子集,mongoose模型提供了find、findOne和findById方法用於文檔查詢

findOne查詢單條,當查詢到一個符合條件的數據時,就會中止繼續查詢並返回查詢結果。

//建立模型,能夠用它來操做數據庫中的person集合,指的是總體
var PersonModel = db.model("person", PersonSchema); //指定返回的字段 1表示 返回 0 不返回 ,, //若是不指定的字段默認不返回 //_id若是不指定也會返回,若是不想讓他返回須要顯式指定爲0
PersonModel.find({},{name:1, age:1, _id:0},function(err,docs){ console.log(docs); }) //當找到第一條匹配的記錄時就馬上返回,再也不繼續查找了,返回單個對象
PersonModel.findOne({name:/^\w+9$/},{name:1, age:1, _id:0},function(err,doc){ console.log(doc); }) //按照ID進行查詢
PersonModel.findById('56ee117356acb568054dd6d4',{name:1, age:1, _id:0},function(err,doc){ console.log(doc); })

  -高級查詢

  使用$gt(>)、$lt(<)、$lte(<=)、$gte(>=)、$ne(不等於)、$in(包含)、$or(或者)、$exists(是否存在)操做符進行排除性的查詢

//建立模型,能夠用它來操做數據庫中的person集合,指的是總體
var PersonModel = db.model("person", PersonSchema); PersonModel.find({'age':{"$gt":6}},{name:1, age:1, _id:0},function(err,docs){ //查詢age>6的數據
 console.log(docs); }) PersonModel.find({'age':{"$gt":6,「$lt」:9}},{name:1, age:1, _id:0},function(err,docs){ //查詢6<age<9的數據
 console.log(docs); }) PersonModel.find({"name":{"$ne":"zf"},'age':{"$gt":6,「$lt」:9}},{name:1, age:1, _id:0},function(err,docs){ //查詢name!='zf'&&6<age<9的數據
 console.log(docs); }) PersonModel.find({"name":{"$in":"zf"}},{name:1, age:1, _id:0},function(err,docs){ //查詢name=='zf'的全部數據
 console.log(docs); }) PersonModel.find({"age":{"$in":[6,7]}},{name:1, age:1, _id:0},function(err,docs){ //查詢age==6或7的全部數據
 console.log(docs); }) PersonModel.find({ age:{ $in: 6}},function(error,docs){ //查詢age等於6的全部數據
 console.log(docs); }); PersonModel.find({ age:{$in:[6,10000]}},function(error,docs){ //能夠把多個值組織成一個數組
 console.log(docs); }); PersonModel.find({email:'email',"$or":[{"name":"zfpx1"},{"age":2000}]},function(error,docs){ //查詢name爲zfpx或age爲6的所有文檔
 console.log(docs); }); var start = new Date(); var end = new Date(); PersonModel.find({time:{$lt:end},time:{$gt:start}},function(error,docs){ //查詢name爲zfpx或age爲6的所有文檔
 console.log(docs); });

  -遊標操做

  數據庫使用遊標返回find的執行結果,客戶端對遊標的實現一般可以對最終結果進行有效的控制。能夠限制結果的數量,略過部分結果,根據任意鍵按任意順序的組合對結果進行各類排序,或者是其餘操做。最經常使用的查詢選項就是限制返回結果的數量(limit函數)、忽略一點數量的結果(skip函數)以及排序(sort函數)。全部這些選項必定要在查詢被髮送到服務器以前指定。

    -limit函數的基本用法  在查詢操做中,有時數據量會很大,這時咱們就須要對返回結果的數量進行限制,就可使用limit函數來限制結果數量

PersonModel.find({name:/zf/},null,{limit:10},function(err,docs){ console.log(docs); });

    -skip函數的基本用法 與limit相似,都是對返回結果數量進行操做,不一樣的是skip函數的功能是略過指定數量的匹配結果,返回餘下的查詢結果

    -sort函數的基本用法 將查詢結果進行排序操做,該函數的參數是一個或多個鍵值對,鍵表示要排序的鍵名,值表示排序的方向,1是升序,-1是降序

//如今要分頁查詢,每頁3條,查詢第2頁 //skip 跳過的條數 limit 限制返回的條數 sort排序 1升序 -1 降序 執行的時候會先排序再skip,再limit
PersonModel.find({},{_id:0,name:1},{limit:3,skip:3,sort:{age:1,name:-1}},function(err,docs){ console.log(docs); });

·保存

  -Model提供了一個create方法來對數據進行保存。 Model.create(文檔數據,callback)

//向集合中插入10個文檔
for(var i=1;i<=10;i++){ //向數據中保存文檔
    PersonModel.create({name:'zfpx'+i,age:i},function(err,doc){ if(err)console.log(err); else console.log(doc);// doci
 }); //全部的異步方法都是在全部的同步方法執行完畢以後才執行的
 console.log(i); }

  -Entity提供了一個save方法對數據進行保存。Entity.save(文檔數據,callback)

//根據模型建立實體,是指的個體對象
var personEntity = new PersonModel({ name : "zf", age : 6, email: "zf@qq.com", home:'beijing' }); //用save 方法把本身保存到數據庫中
personEntity.save(function(error,doc){ if(error){ console.log("error :" + error); }else{ console.log(doc); } });

·數據更新

  Model.update(查詢條件,更新對象,callback) 默認更新一條文檔,若想所有更新,須要加上{multi:true}

//建立模型,能夠用它來操做數據庫中的person集合,指的是總體
var PersonModel = db.model("person", PersonSchema); //$set更新器 指定要更新的字段
var update = {$set : { age : 100 }}; //更新 //multi 更新匹配到的全部的記錄
PersonModel.update({name : 'zf'}, update,{multi:true}, function(error){ if(error) { console.log(error); } else { console.log('Update success!'); } });

·數據刪除 Model.remove(查詢條件,callback)

PersonModel.remove({name:'zf'},function(err,docs){ //result: { ok: 1, n: 3 }
 console.log(docs); });
相關文章
相關標籤/搜索