1. 程式人生 > >MongoDB上手之mongoose

MongoDB上手之mongoose

MongoDB簡介

  • Mongodb是一個開源的NoSQL資料庫,相比MySQL那樣的關係型資料庫,它更顯得 輕巧、靈活,非常適合在資料規模很大、事和性不強的場合下使用。
  • 同時它也是一個物件資料庫,沒有表和行的概念,也沒有固定的模式和結構,所有的資料都是以文件的形式存儲存(文件,就是一個關聯陣列式的物件,它的內部由屬性組成,一個屬性對應的值可能是一個數、字串、日期、陣列、甚至是一個巢狀文件),資料格式就是JSON。

Mongoose是什麼?

  • Mongoose是MongoDB的一個物件模型工具

  • 同時它也是針對MongoDB操作的一個物件模型庫,封裝了MongoDB對文件的的一些增刪改查等常用方法

  • 讓NodeJS操作Mongodb資料庫變得更加靈活簡單

  • Mongoose因為封裝了MongoDB對文件操作的常用方法,可以高效處理mongodb,還提供了類似Schema的功能,如hook、plugin、virtual、populate等機制。

  • 官網 mongoosejs

使用 mongoose

  • 安裝mongoose
$ npm install mongoose
  • 使用mongoose

    • user 使用者名稱
    • pass 密碼
    • ip IP地址
    • port 埠號
    • database 資料庫
    
      var mongoose = require('mongoose');
      var connection = mongoose.createConnection("mongodb://127.0.0.1/test");
    
      connection.on('error', function (error) {
       console.log('資料庫連線失敗: ' + error);
    
      });
    
      connection.on('open', function (error) {
       console.log('資料庫連線成功');
    
      });
    
    

Schema

Schema是資料庫集合的模型骨架 定義了集合中的欄位的名稱和型別以及預設值等資訊

  • Schema.Type
  • NodeJS中的基本資料型別都屬於 Schema.Type 另外Mongoose還定義了自己的型別 基本屬性型別有:
    • 字串(String)
    • 日期型(Date)
    • 數值型(Number)
    • 布林型(Boolean)
    • null
    • 陣列([])
    • 內嵌文件
  • 定義Schema
 var personSchema = new Schema({
      name:String, //姓名
      binary:Buffer,//二進位制
      living:Boolean,//是否活著
      birthday:Date,//生日
      age:Number,//年齡
      _id:Schema.Types.ObjectId,  //主鍵
      _fk:Schema.Types.ObjectId,  //外來鍵
      array:[],//陣列
      arrOfString:[String],//字串陣列
      arrOfNumber:[Number],//數字陣列
      arrOfDate:[Date],//日期陣列
      arrOfBuffer:[Buffer],//Buffer陣列
      arrOfBoolean:[Boolean],//布林值陣列
      arrOfObjectId:[Schema.Types.ObjectId]//物件ID陣列
      nested:{ //內嵌文件
        name:String,
      }

// 如果說物件中的欄位在Schema中沒有,則會被忽略
// 如說說物件中的欄位少於Schema中的欄位,則缺少的欄位不會被儲存,或者儲存Schema中的預設值
// 儲存的欄位和Schema中定義的型別不同,回報錯
                               
let p = new Person();
p.name= 'leo';
p.age = 25;
p.birthday = new Date();
p.married = false;
p.mixed= {any:{other:'other'}};
p._otherId = new mongoose.Types.ObjectId;
p.hobby.push('smoking');
p.ofString.push('string');
p.ofNumber.pop(3);
p.ofDates.addToSet(new Date);
p.ofBuffer.pop();
p.ofMixed = ['anything',3,{name:'leo'}];
p.nested.name = 'leo';

Model

  • Model是由通過Schema構造而成 除了具有Schema定義的資料庫骨架以外,還可以操作資料庫 如何通過Schema來建立Model呢,如下:

    //連線資料庫
    mongoose.connect("mongodb://123.57.143.189:27017/test");
    
    //兩個引數表示定義一個模型
    var PersonModel = mongoose.model("Person", PersonSchema);
    
    // 如果該Model已經定義,則可以直接通過名字獲取
    var PersonModel = mongoose.model('Person');//一個引數表示獲取已定義的模型
    
    // 擁有了Model,我們也就擁有了操作資料庫的能力 在資料庫中的集合名稱等於 模型名轉小寫再轉復數,比如
    // Person>person>people,Child>child>children
    
    // Model 是模型,操作的是豬哥哥集合
    

Entity簡述

通過Model建立的實體,它也可以操作資料庫 使用Model建立Entity,如下示例:

 var personEntity = new PersonModel({
     name : "leo",
     age  : 6

 });

//Schema生成Model,Model創造Entity,Model和Entity都可對資料庫操作,但Model比Entity可以實現的功能更多
// Entity 操作的是自己本身,不會對整個集合處理

  • 儲存Entity
let mongoose = require("mongoose");
mongoose.connect("mongodb://127.0.0.1:27017/persons");

let PersonSchema = new mongoose.Schema({
    name: {type: String},
    age: {type: Number, default: 0}
});

let PersonModel = mongoose.model("Person", PersonSchema);
let PersonEntity = new PersonModel({
    name: "leo",
    age: 6

});

// 使用回撥的方式接收引數
PersonEntity.save(function (error, doc) {
    if (error) {
        console.log("error :" + error);
    } else {
       //doc是返回剛存的person物件 
        console.log(doc);
    }

});

// 使用promise
PersonEntity.save()
.then(doc => {
    //doc是返回剛存的person物件 
     console.log(doc);
}, err => {
    console.log('err', err)
})

ObjectId

  • 儲存在mongodb集合中的每個文件都有一個預設的主鍵_id 這個主鍵名稱是固定的,它可以是mongodb支援的任何資料型別,預設是ObjectId 該型別的值由系統自己生成,從某種意義上幾乎不會重複 ObjectId是一個12位元組的 BSON 型別字串。按照位元組順序,依次代表:
    • 4位元組:UNIX時間戳
    • 3位元組:表示執行MongoDB的機器
    • 2位元組:表示生成此_id的程序
    • 3位元組:由一個隨機數開始的計數器生成的值
  • 每一個文件都有一個特殊的鍵_id,這個鍵在文件所屬的集合中是唯一的。

基礎操作

  • 查詢

語法: Model.find(查詢條件,callback);

// 
// 程式碼
Model.find({},function(error,docs){
  //若沒有向find傳遞引數,預設的是顯示所有文件
});

Model.find({ "age": 6 }, function (error, docs) {
  if(error){
    console.log("error :" + error);
  }else{
    console.log(docs); //docs: age為6的所有文件
  }
});


  • Model儲存

語法: Model.create(文件資料, callback))

 PersonModel.create({ name:"leo", age:7}, function(error,doc){
    if(error) {
        console.log(error);
    } else {
        console.log(doc);
    }
});

  • Entity儲存

語法: Entity.save(callback))

let PersonEntity = new PersonModel({name:"leo",age: 9});

PersonEntity.save(function(error,doc) {
   if(error) {
      console.log(error);
   } else {
      console.log(doc);
   }
});

  • 更新

語法: Model.update(查詢條件,更新物件,callback);


let conditions = {name : 'leo'};
let update = {$set : { age : 100 }};

  PersonModel.update(conditions, update, function(error){
      if(error) {
          console.log(error);
      } else {
          console.log('Update success!');
        }
    });

// 請注意如果匹配到多條記錄,預設只更新一條,如果要更新匹配到的所有記錄的話需要加一個引數 {multi:true}

  • 刪除

語法: Model.remove(查詢條件,callback);

var conditions = { name: 'leo' };

PersonModel.remove(conditions, function(error){
    if(error) {
          console.log(error);
    } else {
        console.log('Delete success!');
    }
});

基本查詢

  • 準備資料
PersonModel.create([
    { name: "leo1", age: 1 },
    { name: "leo2", age: 2 },
    { name: "leo3", age: 3 },
    { name: "leo4", age: 4 },
    { name: "leo5", age: 5 },
    { name: "leo6", age: 6 },
    { name: "leo7", age: 7 },
    { name: "leo8", age: 8 },
    { name: "leo9", age: 9 },
    { name: "leo10", age: 10 }
], function (error, docs) {
    if (error) {
        console.log(error);
    } else {
        console.log('save ok');
    }

});

  • 屬性過濾

語法: find(Conditions,field,callback)

//field省略或為Null,則返回所有屬性。
//返回只包含name、age兩個鍵的所有記錄
Model.find({},{name:1, age:1, _id:0}function(err,docs){
   //docs 查詢結果集
})

// 我們只需要把顯示的屬性設定為大於零的數就可以,當然1是最好理解的,id是預設返回,如果不要顯示加上("id":0)

  • findOne(查詢單條)

    與find相同,但只返回單個文件,也就說當查詢到即一個符合條件的資料時,將停止繼續查詢,並返回查詢結果

語法:findOne(Conditions,callback)

TestModel.findOne({ age: 6}, function (err, doc){
       // 查詢符合age等於6的第一條資料
       // doc是查詢結果
});
  • findById(按ID單條資料),

    與findOne相同,但它只接收文件的_id作為引數,返回單個文件 語法

語法: findById(_id, callback)

PersonModel.findById(person._id, function (err, doc){
     //doc 查詢結果文件
});

  • g t gt、 lt(大於、小於)

查詢時我們經常會碰到要根據某些欄位進行條件篩選查詢,比如說Number型別,怎麼辦呢,我們就可以使用 g t ( &gt; ) gt(&gt;)、 lt(<)、 l t e ( &lt; = ) lte(&lt;=)、 gte(>=)操作符進行排除性的查詢,如下示例:

Model.find({"age":{"$gt":6}},function(error,docs){
   //查詢所有nage大於6的資料
});

Model.find({"age":{"$lt":6}},function(error,docs){
   //查詢所有nage小於6的資料
});

Model.find({"age":{"$gt":6,"$lt":9}},function(error,docs){
  //查詢所有nage大於6小於9的資料
});

  • $ne(不等於)

$ne(!=)操作符的含義相當於不等於、不包含,查詢時我們可通過它進行條件判定,具體使用方法如下:

Model.find({ age:{ $ne:6}},function(error,docs){
  //查詢age不等於6的所有資料
});

  • $in(包含)

n e ne操作符相反, in相當於包含、等於,查詢時查詢包含於指定欄位條件的資料

Model.find({ age:{ $in: 6}},function(error,docs){
   //查詢age等於6的所有資料
});

Model.find({ age:{$in:[6,7]}},function(error,docs){
  //可以把多個值組織成一個數組
});

  • $or(或者)

可以查詢多個鍵值的任意給定值,只要滿足其中一個就可返回,用於存在多個條件判定的情況下使用,如下示例:

Model.find({"$or":[{"name":"leo"},{"age":6}]},function(error,docs){
    //查詢name為leo或age為6的全部文件
});

  • $exists(是否存在)

$exists操作符,可用於判斷某些關鍵欄位是否存在來進行條件查詢。如下示例:

Model.find({name: {$exists: true}},function(error,docs){
      //查詢所有存在name屬性的文件
});

Model.find({email: {$exists: false}},function(error,docs){
      //查詢所有不存在email屬性的文件
});

高階查詢

可以限制結果的數量,跳過部分結果,根據任意鍵對結果進行各種排序

所有這些選項都要在查詢被髮送到伺服器之前指定

  • limit(限制數量)

在查詢操作中,有時資料量會很大,這時我們就需要對返回結果的數量進行限制 那麼我們就可以使用limit函式,通過它來限制結果數量。

語法: find(Conditions,fields,options,callback);

Model.find({},null,{limit:20},function(err,docs){
        console.log(docs);
});
// 如果匹配的結果不到20個,則返回匹配數量的結果,也就是說limit函式指定的是上限而非下限
  • skip(跳過/略過的數量)

skip函式的功能是略過指定數量的匹配結果,返回餘下的查詢結果 如下示例:

語法: find(Conditions,fields,options,callback);

Model.find({},null,{skip:4},function(err,docs){
        console.log(docs);
});
// 上述查詢,如果查詢結果數量中少於4個的話,則不會返回任何結果。
  • sort函式

sort函式可以將查詢結果資料進行排序操作 該函式的引數是一個或多個鍵/值對 鍵代表要排序的鍵名,值代表排序的方向,1是升序,-1是降序

語法: find(Conditions,fields,options,callback)

Model.find({},null,{sort:{age:-1}},function(err,docs){
      //查詢所有資料,並按照age降序順序返回資料docs
});
sort函式可根據使用者自定義條件有選擇性的來進行排序顯示資料結果。
  • 分頁查詢
Model('User').find({})
  .sort({createAt:-1})
  .skip((pageNum-1)*pageSize)
  .limit(pageSize)
  .populate('user')
  .exec(function(err,docs){
     console.log(docs);
  });
  • populate

    pupulate 填充的意思,把集合文件中的一個外鏈轉換成對應的文件,將對應的外來鍵轉換為物件

    下邊是栗子:

var mongoose = require('mongoose');

//連線資料庫
mongoose.connect('mongodb://localhost:27017/201606blog');

//定義課程Schema
var CourseSchema = new mongoose.Schema({
    name:String
});
var CourseModel = mongoose.model('Course',CourseSchema);
var PersonSchema = new mongoose.Schema({
    name:{
        type:String,
        required:true
    },
    // 外來鍵 別的集合的主鍵
    course:{
        type:mongoose.Schema.Types.ObjectId,
        ref
            
           

相關推薦

MongoDB上手mongoose

MongoDB簡介 Mongodb是一個開源的NoSQL資料庫,相比MySQL那樣的關係型資料庫,它更顯得 輕巧、靈活,非常適合在資料規模很大、事和性不強的場合下使用。 同時它也是一個物件資料庫,沒有表和行的概念,也沒有固定的模式和結構,所有的資料都是以文件的形式存儲存

MongoDB上手操作篇

什麼是MongoDB MongoDB是一個基於分散式檔案儲存的開源資料庫系統 MongoDB 將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB 文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列。 Mon

MongoDB上手配置篇

通過配置項啟動資料庫 引數 含義 –dbpath 指定資料庫檔案的目錄 –port 埠 預設是27017 28017 –fork 以後臺守護的方式進行啟動 –logpath 指定日誌檔案輸出路徑 –config 指定一個配置檔案

MongoDB上手部署篇

主從複製 主從複製是一個簡單的資料庫同步備份的叢集技術 在資料庫叢集中要明確知道誰是主伺服器,主伺服器只有一臺 從伺服器要知道自己的資料來源也就是知道自己的主伺服器是誰 –master用來確定主伺服器,–slave和–source 來控制從伺服器 主伺

mongoDB資料庫 Mongoose的使用

簡介 Mongoose是一個物件文件模型(ODM)庫,它對Node原生的MongoDB模組進行了進一步的優化封裝,並提供了更多的功能。核心物件包括Schema、model、document三部分。

大前端路node第(3)天:mongodb資料庫工具Mongoose

mongoDB簡介: mongoDB與一些關係型資料庫相比,它更顯得輕巧、靈活,非常適合在資料規模很大、事務性不強的場合下使用。同時它也是一個物件資料庫,沒有表、行等概念,也沒有固定的模式和結構,所有的資料以文件的形式儲存。 ·由c++語言編寫,是一個分散式檔案儲存的開源NoSQL資料庫

MongoDB學習筆記Mongoose的使用

MongoDB的介紹 在說MongoDB資料插入操作之前,我們先來簡單瞭解下它的資料邏輯結構。 MongoDB的邏輯結構是一種層次結構,主要由:文件(document)、集合(collection)、資料庫(database)這三部分組成的。 文件(doc

使用 mongoose 操作 MongoDB 資料庫 增刪改查

一、前言 CRUD ①正如Java語言裡邊使用JDBC操作MySQL,JavaScript則使用Node.js操作資料庫, ②而Java操作資料一般不用原生的JDBC程式碼,包裝好JDBC的框架提供了眾多的選擇,如DbUtils,Spring的JDBCTe

python編程快速上手第10章實踐項目參考答案(11.11.2)

答案 nic .com final timeout pre image 保存圖片 iframe #!/usr/bin/env python # -*- coding:utf-8 -*- import os import re import urllib import

python編程快速上手第10章實踐項目參考答案(11.11.3)

name driver ret text rul from url .get right from selenium import webdriver from selenium.webdriver.common.keys import Keys import time

python編程快速上手第10章實踐項目參考答案(12.13.1)

true style span tip 12.1 user python input multi #! python3 # multiplicationTable.py import openpyxl,os from openpyxl.styles import Font

python編程快速上手第13章實踐項目參考答案(13.6.1)

encrypted iter close ffi mes python編程 實踐項目 reader blog import os,PyPDF2 os.chdir(‘D:\\My Documents‘) for folderName, subfolders, filenam

python編程快速上手第13章實踐項目參考答案(13.6.2)

nbsp python add sha odi log span import imp #! python3 # encoding: UTF-8 import os import docx from docx import Document from docx.shar

python編程快速上手第15章實踐項目參考答案(17.7.2)

col ges code sid documents mod 編程 bsp tof #! python3 # Import modules and write comments to describe this program. import zipfile, os fr

python編程快速上手第15章實踐項目參考答案(17.7.3)

lane width ima font height 開始 users nco window #! python3 # encoding: UTF-8 import os,docx from PIL import Image, ImageDraw from PIL imp

2、MongoDB學習索引的管理

字段 是否 reat 手動 基本 默認 uniq 匹配 會有 目標:實現索引的創建、查詢、刪除、explan管理等操作 環境: > db.version() 3.4.7 索引創建滿足的基本需求: 1;索引提高查詢速度 2;在mongodb中,索引可以按自動列升序/

4、MongoDB學習備份還原

img com 名稱 mon oot res 全量 metadata src 一、MongoDB備份 1、MongoDB整庫備份 備份數據使用下面的命令 mongodump -h dbhost -d dbname -o dbdirectory 備份user數據庫 [[

6、MongoDB學習主從復制

ges 方式 blog for data- director 分享 .com 復制 環境: 主:127.0.0.1:27017 從:127.0.0.1:27018 一、主庫添加配置文件(master = true) port = 27017 dbpath = /data

【六】MongoDB管理副本集

bottom reference mil 沒有 options 過程 新版 會有 滿足 一、復制介紹 所謂的復制就是在多個主機之間同步數據的過程。 1、數據冗余及可用性 復制技術提供數據冗余及可用性,在不同的數據庫服務器上使用多個數據副本,復制技術防止單個數據庫服務器出現數

【九】MongoDB管理安全性

方法 開啟 oot backup 由於 alt 集群管理 失敗 exec 要保證一個安全的MongoDB運行環境,DBA需要實施一些控制保證用戶或應用程序僅僅訪問它們需要的數據。這些措施包括但不限於: 認證機制 基於角色的訪問控制 加密 審計 一、認證機制 認證是驗證客