天天看點

mybatis mysql upsert_MongoDB學習筆記之Mongoose的使用

摘自http://blog.csdn.net/sinat_25127047/article/details/50560167

**

MongoDB的介紹

**

在說MongoDB資料插入操作之前,我們先來簡單了解下它的資料邏輯結構。

MongoDB的邏輯結構是一種層次結構,主要由:文檔(document)、集合(collection)、資料庫(database)這三部分組成的。

文檔(document):由鍵/值對構成,像{a:1};{s:”abc”}等,它是MongoDB核心單元,MongoDB的文檔(document),相當于關系資料庫中的一行記錄。

集合(Collection):多個文檔組成一個集合(collection),相當于關系資料庫的表。

資料庫(database):多個集合(collection),邏輯上組織在一起,就是資料庫(database)。

一個MongoDB執行個體支援多個資料庫(database)。

安裝及引用

安裝

npm install mongoose

引用mongoose

var mongoose = require(“mongoose”);

使用mongoose連結資料庫

var db = mongoose(“mongodb://user:[email protected]:port/database”);

示例

var mongoose = require(“mongoose”);

var db = mongoose.connect(“mongodb://127.0.0.1:27017/test”);

db.connection.on(“error”, function (error) {

console.log(“資料庫連接配接失敗:” + error);

});

db.connection.on(“open”, function () {

console.log(“——資料庫連接配接成功!——”);

});

MongoDB基礎

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

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

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

Schema

Schema —— 一種以檔案形式存儲的資料庫模型骨架,無法直接通往資料庫端,也就是說它不具備對資料庫的操作能力,僅僅隻是資料庫模型在程式片段中的一種表現,可以說是資料屬性模型(傳統意義的表結構),又或着是“集合”的模型骨架。

定義

var mongoose = require("mongoose")

var TestSchema = new mongoose.Schema({

name : {type:String},

age : {type:Number,default:0},

time : {type:Date,default:Date.now},

emial : {type:String,default:''}

});

基本屬性類型有:字元串、日期型、數值型、布爾型(Boolean)、null、數組、内嵌文檔等

Model

Model —— 由Schema構造生成的模型,除了Schema定義的資料庫骨架以外,還具有資料庫操作的行為,類似于管理資料庫屬性、行為的類。

var db = mongoose.connect("mongodb://127.0.0.1:27017/test");

// 通過Schema建立Model

var TestModel = db.model("test1", TestSchema);

資料庫中的集合名稱,當我們對其添加資料時如果test1已經存在,則會儲存到其目錄下,如果未存在,則會建立test1集合,然後在儲存資料。

Entity

Entity —— 由Model建立的實體,使用save方法儲存資料,Model和Entity都有能影響資料庫的操作,但Model比Entity更具操作性。

var TestEntity = new TestModel({

name : "Lenka",

age : 36,

email : "[email protected]"

});

console.log(TestEntity.name); // Lenka

console.log(TestEntity.age); // 36

**

示例1

**

資料庫的連接配接,Schemal的建立,模型的建立,實體的建立,通過實體儲存資料庫資訊。

var mongoose = require("mongoose");

var db = mongoose.connect("mongodb://127.0.0.1:27017/test");

var TestSchema = new mongoose.Schema({

name : {type:String},

age : {type:Number,default:0},

email : {type:String},

time : {type:Date,default:Date.now}

});

var TestModel = db.model("test1",TestSchema); //'test'相當于collection

var TestEntity = new TestModel({

name:'helloworld',

age:28,

emial:'[email protected]'

});

TestEntity.save(function(err,doc){

if(err){

console.log("error :" + err);

} else {

console.log(doc);

}

});

mybatis mysql upsert_MongoDB學習筆記之Mongoose的使用
mybatis mysql upsert_MongoDB學習筆記之Mongoose的使用

示例2

通過entity、model來完成資料庫的增删查改。

// mongoose 連結

var mongoose = require('mongoose');

var db = mongoose.createConnection('mongodb://127.0.0.1:27017/test');

Schema 結構

var mongooseSchema = new mongoose.Schema({

username : {type : String, default : '匿名使用者'},

title : {type : String},

content : {type : String},

time : {type : Date, default: Date.now},

age : {type : Number}

});

// 添加 mongoose 執行個體方法

mongooseSchema.methods.findbyusername = function(username, callback) {

return this.model('mongoose').find({username: username}, callback);

}

// 添加 mongoose 靜态方法,靜态方法在Model層就能使用

mongooseSchema.statics.findbytitle = function(title, callback) {

return this.model('mongoose').find({title: title}, callback);

}

相當于Schemal是一個構造函數,在這裡可以添加方法findbyuseraname()和findbytitle

model結構

var mongooseModel = db.model('mongoose', mongooseSchema);

我了解為在test資料庫下面建立了mongoose collection的連接配接

Entity結構

//增加操作

var doc = {username : 'emtity_demo_username', title : 'emtity_demo_title', content : 'emtity_demo_content'};

var mongooseEntity = new mongooseModel(doc);

mongooseEntity.save(function(error) {

if(error) {

console.log(error);

} else {

console.log('saved OK!');

}

// 關閉資料庫連結

db.close();

});

//查詢操作

var mongooseEntity = new mongooseModel({});

mongooseEntity.findbyusername('model_demo_username', function(error, result){

if(error) {

console.log(error);

} else {

console.log(result);

}

//關閉資料庫連結

db.close();

});

基于model的增加、修改與查詢

// 增加記錄 基于model操作

var doc = {username : 'model_demo_username', title : 'model_demo_title', content : 'model_demo_content'};

mongooseModel.create(doc, function(error){

if(error) {

console.log(error);

} else {

console.log('save ok');

}

// 關閉資料庫連結

db.close();

});

//修改記錄

//mongooseModel.update(conditions, update, options, callback);

var conditions = {username : 'model_demo_username'};

var update = {$set : {age : 27, title : 'model_demo_title_update'}};

var options = {upsert : true};

mongooseModel.update(conditions, update, options, function(error){

if(error) {

console.log(error);

} else {

console.log('update ok!');

}

//關閉資料庫連結

db.close();

});

// mongoose find

var criteria = {title : 'emtity_demo_title'}; // 查詢條件

var fields = {title : 1, content : 1, time : 1}; // 待傳回的字段

var options = {};

mongooseModel.find(criteria, fields, options, function(error, result){

if(error) {

console.log(error);

} else {

console.log(result);

}

//關閉資料庫連結

db.close();

});

// 删除記錄

var conditions = {username: 'emtity_demo_username'};

mongooseModel.remove(conditions, function(error){

if(error) {

console.log(error);

} else {

console.log('delete ok!');

}

//關閉資料庫連結

db.close();

});

基于執行個體方法的查詢

前面說到findbyusername()在schemal層定義,相當于執行個體化,然後繼承findbyusername()方法

var mongooseEntity = new mongooseModel({});

mongooseEntity.findbyusername('model_demo_username', function(error, result){

if(error) {

console.log(error);

} else {

console.log(result);

}

//關閉資料庫連結

db.close();

});

基于靜态方法的查詢

靜态方法可以直接在模型層調用

// 基于靜态方法的查詢

mongooseModel.findbytitle('emtity_demo_title', function(error, result){

if(error) {

console.log(error);

} else {

console.log(result);

}

//關閉資料庫連結

db.close();

});

我們在連接配接mongodb的時候,明明在資料庫中有資料卻無法查詢出來,這個就有可能是我們在建立model的時候需要指定collections才能查詢出來,如

mongodb.mongoose.model("user", user,"user");

第三個user就是我們的collections的名字