mongoose基本操作


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

介紹了MongoDB,我們下面就要認識Mongoose了。

1. Mongoose是什么?

Mongoose是MongoDB的一個對象模型工具,是基於node-mongodb-native開發的MongoDB nodejs驅動,可以在異步的環境下執行。同時它也是針對MongoDB操作的一個對象模型庫,封裝了MongoDB對文檔的的一些增刪改查等常用方法,讓NodeJS操作Mongodb數據庫變得更加靈活簡單。

2. Mongoose能做什么?

Mongoose,因為封裝了對MongoDB對文檔操作的常用處理方法,讓NodeJS操作Mongodb數據庫變得easy、easy、So easy!

1. 安裝mongoose:

npm install mongoose
2. 引用mongoose:

var mongoose = require("mongoose");
3. 使用"mongoose"連接數據庫:

var db = mongoose.connect("mongodb://user:pass@localhost:port/database");
4. 執行下面代碼檢查默認數據庫test,是否可以正常連接成功?

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中,多個Document可以組成Collection(以下簡稱集合),多個集合又可以組成數據庫。

我們想要操作MongoDB數據,那就得先要具備上面所說的包含數據的“文檔”,文檔又是什么意思呢,請看如下介紹。

文檔 —— 是MongoDB的核心概念,是鍵值對的一個有序集,在JavaScript里文檔被表示成對象。同時它也是MongoDB中數據的基本單元,非常類似於關系型數據庫管理系統中的行,但更具表現力。

集合 —— 由一組文檔組成,如果將MongoDB中的一個文檔比喻成關系型數據庫中的一行,那么一個集合就相當於一張表。

如果我們要通過Mongoose去創建一個“集合”並對其進行增刪改查,該怎么實現呢,到這里我們就要先了解Schema(數據屬性模型)、Model、Entity了。

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

那如何去定義一個Schema呢,請看示例:

var mongoose = require("mongoose");

var TestSchema = new mongoose.Schema({
name : { type:String },//屬性name,類型為String
age : { type:Number, default:0 },//屬性age,類型為Number,默認為0
time : { type:Date, default:Date.now },
email: { type:String,default:''}
});
基本屬性類型有:字符串、日期型、數值型、布爾型(Boolean)、null、數組、內嵌文檔等。

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

如何通過Schema來創建Model呢,如下示例:

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

// 創建Model
var TestModel = db.model("test1", TestSchema);
test1:數據庫中的集合名稱,當我們對其添加數據時如果test1已經存在,則會保存到其目錄下,如果未存在,則會創建test1集合,然后在保存數據。

Entity —— 由Model創建的實體,使用save方法保存數據,Model和Entity都有能影響數據庫的操作,但Model比Entity更具操作性。

使用Model創建Entity,如下示例:

var TestEntity = new TestModel({
name : "Lenka",
age : 36,
email: "lenka@qq.com"
});
console.log(TestEntity.name); // Lenka
console.log(TestEntity.age); // 36
創建成功之后,Schema屬性就變成了Model和Entity的公共屬性了。
實例:
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 );
var TestEntity = new TestModel({
name : "helloworld",
age : 28,
email: "helloworld@qq.com"
});
TestEntity.save(function(error,doc){
if(error){
console.log("error :" + error);
}else{
console.log(doc);
}
});

1.find查詢: obj.find(查詢條件,callback);

 
         

Model.find({},function(error,docs){
//若沒有向find傳遞參數,默認的是顯示所有文檔
});

 
         

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

 
         

2. Model.create(文檔數據, callback))

 
         

Model.create({ name:"model_create", age:26}, function(error,doc){
if(error) {
console.log(error);
} else {
console.log(doc);
}
});

 
         

3. Entity.save(文檔數據, callback))

 
         

var Entity = new Model({name:"entity_save",age: 27});

 
         

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

 
         

4. obj.update(查詢條件,更新對象,callback);

 
         

var conditions = {name : 'test_update'};

 
         

var update = {$set : { age : 16 }};

 
         

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

 
         

5. obj.remove(查詢條件,callback);

 
         

var conditions = { name: 'tom' };

 
         

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

 
         

使用$gt(>)、$lt(<)、$lte(<=)、$gte(>=)操作符進行排除性的查詢,如下示例:

 
         

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

 
         

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

 
         

Model.find({"age":{"$gt":18,"$lt":60}},function(error,docs){
//查詢所有nage大於18小於60的數據
});

 
         

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

 
         

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

 
         

Model.find({name:{$ne:"tom"},age:{$gte:18}},function(error,docs){
//查詢name不等於tom、age>=18的所有數據
});

 
         

和$ne操作符相反,$in相當於包含、等於,查詢時查找包含於指定字段條件的數據。具體使用方法如下:

 
         

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

 
         

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

 
         

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

 
         

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

 
         

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

 
         

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

 
         

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

 
         

結果排序:find(Conditions,fields,options,callback);

 
         

Model.find({},null,{sort:{age:-1}},function(err,docs){
//查詢所有數據,並按照age降序順序返回數據docs
});

 
         

限制數量:find(Conditions,fields,options,callback);

 
         

Model.find({},null,{limit:20},function(err,docs){
console.log(docs);
});

 
         

跳過數量:find(Conditions,fields,options,callback);

 
         

Model.find({},null,{skip:4},function(err,docs){
console.log(docs);
});

 
         

Schema添加屬性值
var mongoose = require('mongoose');

 
         

var TempSchema = new mongoose.Schema;

 
         

TempSchema.add({ name: 'String', email: 'String', age: 'Number' })

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM