mongoose 增刪改查 基礎篇
###1.1 名詞解釋
-
Schema(模式,架構)
: 一種以檔案形式儲存的資料庫模型骨架,不具備資料庫的操作能力 -
Mode(模型)
: 由Schema
釋出生成的模型,具有抽象屬性和行為的資料庫操作對 -
Entity(實體)
: 由Model
建立的實體,他的操作也會影響資料庫
注意:
1.本學習文件採用嚴格命名方式來區別不同物件,例如:
varPersonSchema;//Person的文字屬性varPersonModel;//Person的資料庫模型varPersonEntity;//Person實體
2.Schema
、Model
、Entity
Schema
生成Model
,Model
創造Entity
,Model
和Entity
都可對資料庫操作造成影響,但Model
比Entity
更具操作性。
##1.2 準備工作
2.在專案只能夠建立一個數據庫連線,如下:
var mongoose =require('mongoose');//引用mongoose模組var db = mongoose.createConnection('localhost','test');//建立一個數據庫連線
3.開啟本機localhost
的test
資料庫時,我們可以監測是否有異常
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. 具體的如何配置Schema
、Model
以及Model
和Entity
的相關操作,我們會在後面進行
2.
Model
和Entity
都有能影響資料庫的操作,但仍有區別,後面我們也會做解釋
##二、新手指引
如果您還不清楚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
Buffer
和ArrayBuffer
是Nodejs
兩種隱藏的物件,相關內容請檢視NodeJS-API
####1.6 關於Mixed
Schema.Types.Mixed
是Mongoose
定義個混合型別,該混合型別如果未定義具體形式。因此,如果定義具體內容,就直接使用{}
來定義,以下兩句等價
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
Array
在JavaScript
程式語言中並不是陣列,而是集合,因此裡面可以存入不同的值,以下程式碼等價:
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
不僅要為後面的Model
和Entity
提供公共的屬性,還要提供公共的方法。
下面例子比快速通道的例子更加高階,可以進行高階擴充套件:
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 ="海