1. 程式人生 > >mongoose 增刪改查 基礎篇

mongoose 增刪改查 基礎篇

###1.1 名詞解釋

  • Schema(模式,架構) : 一種以檔案形式儲存的資料庫模型骨架,不具備資料庫的操作能力

  • Mode(模型) : 由Schema釋出生成的模型,具有抽象屬性和行為的資料庫操作對

  • Entity(實體) : 由Model建立的實體,他的操作也會影響資料庫

注意

1.本學習文件採用嚴格命名方式來區別不同物件,例如:

varPersonSchema;//Person的文字屬性varPersonModel;//Person的資料庫模型varPersonEntity;//Person實體

2.SchemaModelEntity

的關係請牢記,Schema生成ModelModel創造EntityModelEntity都可對資料庫操作造成影響,但ModelEntity更具操作性。

##1.2 準備工作

2.在專案只能夠建立一個數據庫連線,如下:

var mongoose =require('mongoose');//引用mongoose模組var db = mongoose.createConnection('localhost','test');//建立一個數據庫連線

3.開啟本機localhosttest資料庫時,我們可以監測是否有異常

    db.on('error',console.
error.bind(console,'連線錯誤:')); db.once('open',function(){//一次開啟記錄});

注意

成功開啟資料庫後,就可以執行資料庫相應操作,假設以下程式碼都在回撥中處理

4.定義一個Schema

varPersonSchema=new mongoose.Schema({
      name:String//定義一個屬性name,型別為String});

5.將該Schema釋出為Model

varPersonModel= db.model('Person',PersonSchema);//如果該Model已經發布,則可以直接通過名字索引到,如下:
//var PersonModel = db.model('Person');//如果沒有釋出,上一段程式碼將會異常

6.用Model建立Entity

var personEntity =newPersonModel({name:'Krouky'});//列印這個實體的名字看看
    console.log(personEntity.name);//Krouky

7.我們甚至可以為此Schema建立方法

//為Schema模型追加speak方法PersonSchema.methos.speak =function(){
      console.log('我的名字叫'+this.name);}varPersonModel= db.model('Person',PersonSchema);var personEntity =newPersonModel({name:'Krouky'});
    personEntity.speak();//我的名字叫Krouky

8.Entity是具有具體的資料庫操作CRUD

    personEntity.save();//執行完成後,資料庫就有該資料了

9.如果要執行查詢,需要依賴Model,當然Entity也是可以做到的

PersonModel.find(function(err,persons){//查詢到的所有person});

注意

1. 具體的如何配置SchemaModel以及ModelEntity的相關操作,我們會在後面進行

2. ModelEntity都有能影響資料庫的操作,但仍有區別,後面我們也會做解釋

##二、新手指引

如果您還不清楚Mongoose是如何工作的,請參看第一章快速通道快速瀏覽他的用法吧

###1. Schema——純潔的資料庫原型

####1.1 什麼是Schema

  • 我理解Schema僅僅只是一斷程式碼,他書寫完成後程式依然無法使用,更無法通往資料庫端
  • 他僅僅只是資料庫模型在程式片段中的一種表現,或者是資料屬性模型

####1.2 如何定義Schema

varBlogSchema=newSchema({
      title:String,
      author:String//new Schema()中傳入一個JSON物件,該物件形如 xxx:yyyy ,/xxx是一個字串,定義了屬性,yyy是一個Schema.Type,定義了屬性型別});

####1.3 什麼是Schema.Type

Schema.Type是由Mongoose內定的一些資料型別,基本資料型別都在其中,他也內建了一些Mongoose特有的Schema.Type。當然,你也可以自定義Schema.Type,只有滿足Schema.Type的型別才能定義在Schema內。

####1.4 Schema.Types

NodeJS中的基本資料型別都屬於Schema.Type,另外Mongoose還定義了自己的型別

//舉例:varExampleSchema=newSchema({
      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,}});

####1.5 關於Buffer

BufferArrayBufferNodejs兩種隱藏的物件,相關內容請檢視NodeJS-API

####1.6 關於Mixed

Schema.Types.MixedMongoose定義個混合型別,該混合型別如果未定義具體形式。因此,如果定義具體內容,就直接使用{}來定義,以下兩句等價

varAnySchema=newSchema({any:{}});varAnySchema=newSchema({any:Schema.Types.Mixed});

混合型別因為沒有特定約束,因此可以任意修改,一旦修改了原型,則必須呼叫markModified()

    person.anything ={x:[3,4,{y:'change'}]}
    person.markModified('anything');//傳入anything,表示該屬性型別發生變化
    person.save();

####1.7 關於ObjectId

主鍵,一種特殊而且非常重要的型別,每個Schema都會預設配置這個屬性,屬性名為_id,除非自己定義,方可覆蓋

var mongoose =require('mongoose');varObjectId= mongoose.Schema.Types.ObjectId;varStudentSchema=newSchema({});//預設會有_id:ObjectIdvarTeacherSchema=newSchema({id:ObjectId});//只有id:ObjectId

該型別的值由系統自己生成,從某種意義上幾乎不會重複,生成過程比較複雜,有興趣的朋友可以檢視原始碼。

####1.8 關於Array

ArrayJavaScript程式語言中並不是陣列,而是集合,因此裡面可以存入不同的值,以下程式碼等價:

varExampleSchema1=newSchema({array:[]});varExampleSchema2=newSchema({array:Array});varExampleSchema3=newSchema({array:[Schema.Types.Mixed]});varExampleSchema4=newSchema({array:[{}]});

####1.9 附言

Schema不僅定義了文件結構使用效能,還可以有擴充套件外掛例項方法靜態方法複合索引文件生命週期鉤子

Schema可以定義外掛,並且外掛具有良好的可拔插性,請有興趣的讀者繼續往後閱讀或者查閱官方資料。

###2. Schema的擴充套件

####2.1 例項方法

有的時候,我們創造的Schema不僅要為後面的ModelEntity提供公共的屬性,還要提供公共的方法。

下面例子比快速通道的例子更加高階,可以進行高階擴充套件:

varPersonSchema=newSchema({name:String,type:String});//查詢類似資料PersonSchema.methods.findSimilarTypes =function(cb){returnthis.model('Person').find({type:this.type},cb);}

使用如下:

varPersonModel= mongoose.model('Person',PersonSchema);var krouky =newPersonSchema({name:'krouky',type:'前端工程師'});
    krouky.findSimilarTypes(function(err,persons){//persons中就能查詢到其他前端工程師});

相關推薦

mongoose 刪改 基礎

###1.1 名詞解釋 Schema(模式,架構) : 一種以檔案形式儲存的資料庫模型骨架,不具備資料庫的操作能力 Mode(模型) : 由Schema釋出生成的模型,具有抽象屬性和行為的資料庫操作對 Entity(實體) : 由

MySQL刪改基礎知識

add 內連接 har ren 組合 lec 字段 傳統 efault 前幾天學習了MySQL數據庫的一些基礎知識,了解了後臺數據庫的一些基礎的數據操作:增刪改查,對於項目前後臺的數據傳遞有了些概念,總結了一些MySQL的基礎語法。 一、數據存儲形式發展和數據庫作用 根

MySQL 刪改基礎

group by sum between let 建數據庫 drop null ret limit 終端登錄mysql:   mysql -u root -p   1111aaaa 創建數據庫:   create DATABASE DBname; 刪除數據庫:   dro

MongoDB的java操作刪改總結(內嵌文件、陣列)

Mongo資料User: "_id" : "11373126679","name" : "Wangwei","his_Record" : [{"bikeId" : "309","status" : 1}],"location" : {"Area" : "aaa","X" :

Myeclipse+tomcat+mysql,B/S實現學生資訊的刪改(實現)

 小生第一次用Myeclipse和Mysql做東西,邊學邊做,處處遇到問題,然後自己搜資料和分析去解決  測試通過!  工程檔案目錄 index.jsp <%@ page language="java" import="java.util.*" pageEncod

MYSQL資料庫 刪改基礎語句

語法:create table tablename(column_name_1 column_type_1 constraints,column_name_2 column_type_2 constraints,column_name_3 column_type_3 constraints)

基於ajax的三層,實現資料庫刪改基礎(一DAL)

  三層的組成就是DAL,BLL,UI層和Model層。其中的DAL層是與資料庫連結,需要引用Model層,進行對資料的操作,但我們一般在此層不進行資料的處理。BLL層負責引用DAL和MODEL層,在

java訪問資料庫sql server刪改第二

1、Xsxxgl.java import java.awt.*;import java.awt.event.*;import java.sql.*;import java.util.*;import javax.swing.*;public class Xsxxgl exte

nodejs+mongoose 刪改

var mongoose = require('mongoose');var conn = mongoose.connect('mongodb://10.16.12.95:40000/test');var Schema = mongoose.Schema;var Object

MySQL基礎(庫/表的刪改

上一篇我們已經在Linux系統裝好了MySQL,現在我們來熟悉一下MySQL及它的操作語句。 MySQL是一個關係型資料庫管理系統,MySQL 是最流行的關係型資料庫管理系統之一. 設計模型: E-R設計模型【E表示Entry,實體】、【R表示Relationship,關係】。

基礎--jdbc連線mysql資料庫和一套刪改

JDBC筆記 1.新建專案(java)JDBCDome 2.新建包(lib)         匯入兩個JAR             (1)連線資料庫             (2)測試的[email protected] 3.新建一個包jdbc.poj

TP5學習基礎一:刪改小demo

表單 arr 處理 php req 學習 model類 浪費 新手 ①TP5--增刪改查簡單的demo 我先吐槽一下:因為工作需要研究tp5,去官網看了一下哎呦,資源挺多挺全啊!然後下載唯一免費的官方教程,我曹pdf打開533頁。講的很細但是開發能等看完才做嗎?看到精簡版快

Mysql 入門,刪改(進階

bsp com pre sco height name 數據 mysql from 主要已以下兩個表students與students_score,進行數據的增刪改查操作! 1、SELECT 1)select id,tel from students

【2017-06-01】Linq基礎+Lambda表達式實現對數據庫的刪改

partial 表名 .net 之前 滿足 image nbsp word 提交 一、Linq to sql 類 高集成化的數據庫訪問技術 使用Linq可以代替之前的Ado.Net。省去了自己敲代碼的實體類和數據訪問類的大量工作。 實體類: 添加一個Linq to sql

2017-6-1 Linq 基礎查詢 (刪改

load title -1 style part ids deb control idt 用小型人員管理系統的項目實戰來練習linq的基礎增刪改查: using System; using System.Collections.Generic; using System

Linq基礎刪改

alt 技術分享 .class select 匿名函數 write 數據庫連接 oca title 使用Linq時要註意一下問題:1.創建Linq連接後生成的dbml文件不要變動,生成的表不要碰,拖動表也會造成數據庫連接發生變動,需要重新保存.2.屬性拓展的使用:添加一個新

python 基礎 字典 刪改

() test bsp 返回 one false ont val als content = {"name":"wd","pc":{"phone":111111,"age":18},"woniu":["122222",18]} 增 content[‘kk‘] = ‘

cocos2d-x-lua基礎系列教程六(lua-table刪改

{} cat ng-click 位置 rip 腳本 ack content -c lua-table庫 1。插入 table.insert () --假設沒有設定位置。默認last位置 樣例: myTable = {

MySQL數據庫學習【第三刪改操作

自增id 命令 位置參數 modify 刪除一行 style 主鍵 客戶端 drop 註意:1.如果你在cmd中書命令的時候,輸入錯了就用\c跳出 2.\s查看配置信息 一、操作文件夾(庫) 增:create database db1 charset utf8;

Django 【第五】ORM單表刪改

contains 字典 exc 單表 pytho name屬性 作者 包括 刪除數據 一、添加表記錄 對於單表有兩種方式 # 添加數據的兩種方式 # 方式一:實例化對象就是一條表記錄 Frank_obj = models.Student(name ="海