[轉] mongoDB與mongoose

來源:互聯網
上載者:User

標籤:help   組成   count   方向   合并   mongodb使用   伺服器   ber   執行個體   

mongoDB簡介

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

·由c++語言編寫,是一個分布式檔案儲存體的開源NoSQL資料庫系統。在高負載的情況下,添加更多的節點,可以保證伺服器效能。

· mongoDB旨在為web應用提供可擴充的高效能資料儲存解決方案

· mongoDB將資料存放區為一個文檔,資料結構由索引值對組成。mongoDB文檔類似於JSON對象,欄位值可以包含其他文檔、數組及文檔數組。

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

安裝視覺化檢視,如robomongo、mongovue等

mongodb的啟動與串連

  - windows啟動伺服器端 找到mongodb的安裝目錄(比如是D:\mongodb),shift+右鍵開啟命令視窗,建立一個data檔案夾,在命令列中輸入

    mongod --dbpath=D:\mongodb\data

    如果出現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字串

      - 不能是Null 字元串

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

      - 應全部小寫

      - 最多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:[email protected]: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: "[email protected]",    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: "[email protected]",    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如果不指定也會返回,如果不想讓他返回需要顯式指定為0PersonModel.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,再limitPersonModel.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: "[email protected]",    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);});

[轉] mongoDB與mongoose

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.