国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

一篇文章帶你入門Mongoose

wayneli / 1345人閱讀

摘要:當然,可以使用方法來簡寫代碼刪除第個元素類似的,該方法也不能省略回調函數,否則數據不會被刪除。

走在前端的大道上

</>復制代碼

  1. Mongoose是在node.js環境下對mongodb進行便捷操作的對象模型工具

因此,要使用mongoose,則必須安裝node.js環境以及mongodb數據庫。mongoose使mongodb操作更簡單便捷。可以在 github 中獲得其源碼,也可以在這里查看 api 文檔,英文的。

安裝

  
安裝nodejs和mongodb之后 ,使用npm來安裝mongoose

</>復制代碼

  1. npm install mongoose --save

安裝成功后,就可以通過 require("mongoose") 來使用


connect connect 用于創建數據庫連接

</>復制代碼

  1. mongoose.connect(url(s), [options], [callback])
  2. //url(s):數據庫地址,可以是多個,以`,`隔開
  3. //options:可選,配置參數
  4. //callback:可選,回調
  5. mongoose.connect("mongodb://數據庫地址(包括端口號)/數據庫名稱")
指定用戶連接

</>復制代碼

  1. mongoose.connect("mongodb://用戶名:密碼@127.0.0.1:27017/數據庫名稱")
連接多個數據庫

如果你的app中要連接多個數據庫,只需要設置多個url以,隔開,同時設置mongos為true

</>復制代碼

  1. mongoose.connect("urlA,urlB,...", {
  2. mongos : true
  3. })
回調參數

</>復制代碼

  1. mongoose.connect(url, options, function(error) {
  2. });

執行下列代碼后,控制臺輸出“連接成功”

</>復制代碼

  1. var mongoose = require("mongoose");
  2. mongoose.connect("mongodb://localhost/test", function(err) {
  3. if(err){
  4. console.log("連接失敗");
  5. }else{
  6. console.log("連接成功");
  7. }
  8. });

 如果開啟鑒權控制,以用戶名"u1",密碼"123456"登錄"db1"數據庫。執行代碼后,控制臺輸出“連接成功”

</>復制代碼

  1. var mongoose = require("mongoose");
  2. mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {
  3. if(err){
  4. console.log("連接失敗");
  5. }else{
  6. console.log("連接成功");
  7. }
  8. });

簡單實驗

創建一個db.js

</>復制代碼

  1. var mongoose = require("mongoose"),
  2. DB_URL = "mongodb://localhost:27017/mongoosesample";
  3. /**
  4. * 連接
  5. */
  6. mongoose.connect(DB_URL);
  7. /**
  8. * 連接成功
  9. */
  10. mongoose.connection.on("connected", function () {
  11. console.log("Mongoose connection open to " + DB_URL);
  12. });
  13. /**
  14. * 連接異常
  15. */
  16. mongoose.connection.on("error",function (err) {
  17. console.log("Mongoose connection error: " + err);
  18. });
  19. /**
  20. * 連接斷開
  21. */
  22. mongoose.connection.on("disconnected", function () {
  23. console.log("Mongoose connection disconnected");
  24. });

  調用node db.js執行就會看到輸出如下圖


disconnect()

</>復制代碼

  1. mongoose.disconnect()

使用disconnect()方法可以斷開連接

</>復制代碼

  1. var mongoose = require("mongoose");
  2. mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {
  3. if(err){
  4. console.log("連接失敗");
  5. }else{
  6. console.log("連接成功");
  7. }
  8. });
  9. setTimeout(function(){
  10. mongoose.disconnect(function(){
  11. console.log("斷開連接");
  12. })
  13. }, 2000);


Schema

</>復制代碼

  1. Schema主要用于定義MongoDB中集合Collection里文檔document的結構,可以理解為mongoose對表結構的定義(不僅僅可以定義文檔的結構和屬性,還可以定義文檔的實例方法、靜態模型方法、復合索引等),每個schema會映射到mongodb中的一個collection,schema不具備操作數據庫的能力

 定義Schema非常簡單,指定字段名和類型即可,支持的類型包括以下8種

</>復制代碼

  1. String 字符串
  2. Number 數字
  3. Date 日期
  4. Buffer 二進制
  5. Boolean 布爾值
  6. Mixed 混合類型
  7. ObjectId 對象ID
  8. Array 數組

 通過mongoose.Schema來調用Schema,然后使用new方法來創建schema

</>復制代碼

  1. var mongoose = require("mongoose");
  2. var Schema = mongoose.Schema;
  3. var mySchema = new Schema({
  4. title: String,
  5. author: String,
  6. body: String,
  7. comments: [{ body: String, date: Date }],
  8. date: { type: Date, default: Date.now },
  9. hidden: Boolean,
  10. meta: {
  11. votes: Number,
  12. favs: Number
  13. }
  14. });

 注意 創建Schema對象時,聲明字段類型有兩種方法,一種是首字母大寫的字段類型,另一種是引號包含的小寫字段類型

</>復制代碼

  1. var mySchema = new Schema({title:String, author:String});
  2. //或者
  3. var mySchema = new Schema({title:"string", author:"string"});

 如果需要在Schema定義后添加其他字段,可以使用add()方法

</>復制代碼

  1. var MySchema = new Schema;
  2. MySchema.add({ name: "string", color: "string", price: "number" });

Model

</>復制代碼

  1.  Model是由Schema編譯而成的假想(fancy)構造器,具有抽象屬性和行為。Model的每一個實例(instance)就是一個documentdocument可以保存到數據庫和對數據庫進行操作。簡單說就是model是由schema生成的模型,可以對數據庫的操作。

  使用model()方法,將Schema編譯為Model。model()方法的第一個參數是模型名稱

</>復制代碼

  1. mongoose.model(`文檔名稱`, Schema)

  注意 一定要將model()方法的第一個參數和其返回值設置為相同的值,否則會出現不可預知的結果

  Mongoose會將集合名稱設置為模型名稱的小寫版。如果名稱的最后一個字符是字母,則會變成復數;如果名稱的最后一個字符是數字,則不變;如果模型名稱為"MyModel",則集合名稱為"mymodels";如果模型名稱為"Model1",則集合名稱為"model1"

</>復制代碼

  1. var schema = new mongoose.Schema({ num:Number, name: String, size: String});
  2. var MyModel = mongoose.model("MyModel", schema);

【實例化文檔document】

  通過對原型Model1使用new方法,實例化出文檔document對象

</>復制代碼

  1. var mongoose = require("mongoose");
  2. mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {
  3. if(err){
  4. console.log("連接失敗");
  5. }else{
  6. console.log("連接成功");
  7. var schema = new mongoose.Schema({ num:Number, name: String, size: String});
  8. var MyModel = mongoose.model("MyModel", schema);
  9. var doc1 = new MyModel({ size: "small" });
  10. console.log(doc1.size);//"small"
  11. }
  12. });

【文檔保存】

  通過new Model1()創建的文檔doc1,必須通過save()方法,才能將創建的文檔保存到數據庫的集合中,集合名稱為模型名稱的小寫復數版

  回調函數是可選項,第一個參數為err,第二個參數為保存的文檔對象

</>復制代碼

  1. save(function (err, doc) {})

</>復制代碼

  1. var mongoose = require("mongoose");
  2. mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {
  3. if(!err){
  4. var schema = new mongoose.Schema({ num:Number, name: String, size: String });
  5. var MyModel = mongoose.model("MyModel", schema);
  6. var doc1 = new MyModel({ size: "small" });
  7. doc1.save(function (err,doc) {
  8. //{ __v: 0, size: "small", _id: 5970daba61162662b45a24a1 }
  9. console.log(doc);
  10. })
  11. }
  12. });

  由下圖所示,db1數據庫中的集合名稱為mymodels,里面有一個{size:"small"}的文檔

自定義方法
【實例方法】

  Model的實例是document,內置實例方法有很多,如 save,可以通過Schema對象的methods屬性給實例自定義擴展方法

</>復制代碼

  1. var mongoose = require("mongoose");
  2. mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {
  3. if(!err){
  4. var schema = new mongoose.Schema({ num:Number, name: String, size: String });
  5. schema.methods.findSimilarSizes = function(cb){
  6. return this.model("MyModel").find({size:this.size},cb);
  7. }
  8. var MyModel = mongoose.model("MyModel", schema);
  9. var doc1 = new MyModel({ name:"doc1", size: "small" });
  10. var doc2 = new MyModel({ name:"doc2", size: "small" });
  11. var doc3 = new MyModel({ name:"doc3", size: "big" });
  12. doc1.save();
  13. doc2.save();
  14. doc3.save();
  15. setTimeout(function(){
  16. doc1.findSimilarSizes(function(err,docs){
  17. docs.forEach(function(item,index,arr){
  18. //doc1
  19. //doc2
  20. console.log(item.name)
  21. })
  22. })
  23. },0)
  24. }
  25. });

【靜態方法】

  通過Schema對象的statics屬性給 Model 添加靜態方法

</>復制代碼

  1. var mongoose = require("mongoose");
  2. mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {
  3. if(!err){
  4. var schema = new mongoose.Schema({ num:Number, name: String, size: String });
  5. schema.statics.findByName = function(name,cb){
  6. return this.find({name: new RegExp(name,"i")},cb);
  7. }
  8. var MyModel = mongoose.model("MyModel", schema);
  9. var doc1 = new MyModel({ name:"doc1", size: "small" });
  10. var doc2 = new MyModel({ name:"doc2", size: "small" });
  11. var doc3 = new MyModel({ name:"doc3", size: "big" });
  12. doc1.save();
  13. doc2.save();
  14. doc3.save();
  15. setTimeout(function(){
  16. MyModel.findByName("doc1",function(err,docs){
  17. //[ { _id: 5971e68f4f4216605880dca2,name: "doc1",size: "small",__v: 0 } ]
  18. console.log(docs);
  19. })
  20. },0)
  21. }
  22. });

  由上所示,實例方法和靜態方法的區別在于,靜態方法是通過Schema對象的statics屬性給model添加方法,實例方法是通過Schema對象的methods是給document添加方法

【Methods 和 Statics 的區別】

statics是給model添加方法,methods是給實例(instance)添加方法。methods和statics的區別

</>復制代碼

  1. //module.exports = mongoose.model(`Article`, ArticleSchema )
  2. //將article的model保存為文件 article.js
  3. const Article = require("../models/article")
  4. // statics
  5. Article.staticFunc ()
  6. //methods
  7. const article = new Article(arguments)
  8. article.methodFunc()

【查詢方法】

  通過schema對象的query屬性,給model添加查詢方法

</>復制代碼

  1. var mongoose = require("mongoose");
  2. mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {
  3. if(!err){
  4. var schema = new mongoose.Schema({ age:Number, name: String});
  5. schema.query.byName = function(name){
  6. return this.find({name: new RegExp(name)});
  7. }
  8. var temp = mongoose.model("temp", schema);
  9. temp.find().byName("huo").exec(function(err,docs){
  10. //[ { _id: 5971f93be6f98ec60e3dc86c, name: "huochai", age: 27 },
  11. // { _id: 5971f93be6f98ec60e3dc86e, name: "huo", age: 30 } ]
  12. console.log(docs);
  13. })
  14. }
  15. });

文檔新增

文檔新增有三種方法,一種是使用上面介紹過的文檔的save()方法,另一種是使用模型model的create()方法,最后一種是模型model的insertMany()方法

save()

  [注意]回調函數可以省略

</>復制代碼

  1. save([options], [options.safe], [options.validateBeforeSave], [fn])

  新建{age:10,name:"save"}文檔,并保存

</>復制代碼

  1. var mongoose = require("mongoose");
  2. mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {
  3. if(!err){
  4. var schema = new mongoose.Schema({ age:Number, name: String});
  5. var temp = mongoose.model("temp", schema);
  6. //使用鏈式寫法
  7. new temp({age:10,name:"save"}).save(function(err,doc){
  8. //[ { _id: 59720bc0d2b1125cbcd60b3f, age: 10, name: "save", __v: 0 } ]
  9. console.log(doc);
  10. });
  11. }
  12. });
create()

  使用save()方法,需要先實例化為文檔,再使用save()方法保存文檔。而create()方法,則直接在模型Model上操作,并且可以同時新增多個文檔

</>復制代碼

  1. Model.create(doc(s), [callback])

  新增{name:"xiaowang"},{name:"xiaoli"}這兩個文檔

</>復制代碼

  1. var mongoose = require("mongoose");
  2. mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {
  3. if(!err){
  4. var schema = new mongoose.Schema({ age:Number, name: String});
  5. var temp = mongoose.model("temp", schema);
  6. temp.create({name:"xiaowang"},{name:"xiaoli"},function(err,doc1,doc2){
  7. //{ __v: 0, name: "xiaowang", _id: 59720d83ad8a953f5cd04664 }
  8. console.log(doc1);
  9. //{ __v: 0, name: "xiaoli", _id: 59720d83ad8a953f5cd04665 }
  10. console.log(doc2);
  11. });
  12. }
  13. });
insertMany()

Model.insertMany(doc(s), [options], [callback])
  新增{name:"a"},{name:"b"}這兩個文檔

</>復制代碼

  1. var mongoose = require("mongoose");
  2. mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {
  3. if(!err){
  4. var schema = new mongoose.Schema({ age:Number, name: String});
  5. var temp = mongoose.model("temp", schema);
  6. temp.insertMany([{name:"a"},{name:"b"}],function(err,docs){
  7. //[ { __v: 0, name: "a", _id: 59720ea1bbf5792af824b30c },
  8. //{ __v: 0, name: "b", _id: 59720ea1bbf5792af824b30d } ]
  9. console.log(docs);
  10. });
  11. }
  12. });

文檔查詢

使用Mongoose來查找文檔很容易,有以下3種方法可供選擇

</>復制代碼

  1. find()
  2. findById()
  3. findOne()
find()

  第一個參數表示查詢條件,第二個參數用于控制返回的字段,第三個參數用于配置查詢參數,第四個參數是回調函數,回調函數的形式為function(err,docs){}

</>復制代碼

  1. Model.find(conditions, [projection], [options], [callback])

  在數據庫db1的集合temps中存在如下數據

 現在,使用find()方法找出所有數據

</>復制代碼

  1. var mongoose = require("mongoose");
  2. mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {
  3. if(!err){
  4. var schema = new mongoose.Schema({ age:Number, name: String});
  5. var temp = mongoose.model("temp", schema);
  6. temp.find(function(err,docs){
  7. //[ { _id: 5971f93be6f98ec60e3dc86c, name: "huochai", age: 27 },
  8. //{ _id: 5971f93be6f98ec60e3dc86d, name: "wang", age: 18 },
  9. //{ _id: 5971f93be6f98ec60e3dc86e, name: "huo", age: 30 },
  10. //{ _id: 5971f93be6f98ec60e3dc86f, name: "li", age: 12 } ]
  11. console.log(docs);
  12. })
  13. }
  14. });

</>復制代碼

  1. 找出年齡大于18的數據

</>復制代碼

  1. temp.find({age:{$gte:18}},function(err,docs){
  2. //[ { _id: 5971f93be6f98ec60e3dc86c, name: "huochai", age: 27 },
  3. //{ _id: 5971f93be6f98ec60e3dc86d, name: "wang", age: 18 },
  4. //{ _id: 5971f93be6f98ec60e3dc86e, name: "huo", age: 30 }]
  5. console.log(docs);
  6. })

  找出年齡大于18且名字里存在"huo"的數據

</>復制代碼

  1. temp.find({name:/huo/,age:{$gte:18}},function(err,docs){
  2. //[ { _id: 5971f93be6f98ec60e3dc86c, name: "huochai", age: 27 },
  3. //{ _id: 5971f93be6f98ec60e3dc86e, name: "huo", age: 30 }]
  4. console.log(docs);
  5. })

  找出名字里存在"a"的數據,且只輸出"name"字段

  [注意]_id字段默認輸出

</>復制代碼

  1. temp.find({name:/a/},"name",function(err,docs){
  2. //[ { _id: 5971f93be6f98ec60e3dc86c, name: "huochai" },
  3. //{ _id: 5971f93be6f98ec60e3dc86d, name: "wang" } ]
  4. console.log(docs);
  5. })

  如果確實不需要_id字段輸出,可以進行如下設置

</>復制代碼

  1. temp.find({name:/a/},{name:1,_id:0},function(err,docs){
  2. //[ { name: "huochai" }, { name: "wang" } ]
  3. console.log(docs);
  4. })

</>復制代碼

  1. 找出跳過前兩條數據的其他所有數據

  [注意]如果使用第三個參數,前兩個參數如果沒有值,需要設置為null

</>復制代碼

  1. temp.find(null,null,{skip:2},function(err,docs){
  2. //[ { _id: 5971f93be6f98ec60e3dc86e, name: "huo", age: 30 },
  3. //{ _id: 5971f93be6f98ec60e3dc86f, name: "li", age: 12 } ]
  4. console.log(docs);
  5. })
findById()

</>復制代碼

  1. Model.findById(id, [projection], [options], [callback])

  顯示第0個元素的所有字段

</>復制代碼

  1. var aIDArr = [];
  2. temp.find(function(err,docs){
  3. docs.forEach(function(item,index,arr){
  4. aIDArr.push(item._id);
  5. })
  6. temp.findById(aIDArr[0],function(err,doc){
  7. //{ _id: 5971f93be6f98ec60e3dc86c, name: "huochai", age: 27 }
  8. console.log(doc);
  9. })
  10. })

  以上代碼的另一種寫法如下

</>復制代碼

  1. var aIDArr = [];
  2. temp.find(function(err,docs){
  3. docs.forEach(function(item,index,arr){
  4. aIDArr.push(item._id);
  5. })
  6. temp.findById(aIDArr[0]).exec(function(err,doc){
  7. //{ _id: 5971f93be6f98ec60e3dc86c, name: "huochai", age: 27 }
  8. console.log(doc);
  9. })
  10. })

  只輸出name字段

</>復制代碼

  1. temp.findById(aIDArr[0],{name:1,_id:0},function(err,doc){
  2. //{ name: "huochai"}
  3. console.log(doc);
  4. })

  或者寫成下面這種形式

</>復制代碼

  1. temp.findById(aIDArr[0],{name:1,_id:0}).exec(function(err,doc){
  2. //{ name: "huochai"}
  3. console.log(doc);
  4. })

  輸出最少的字段

</>復制代碼

  1. temp.findById(aIDArr[0],{lean:true},function(err,doc){
  2. //{ _id: 5971f93be6f98ec60e3dc86c }
  3. console.log(doc);
  4. })
  5. temp.findById(aIDArr[0],{lean:true}).exec(function(err,doc){
  6. //{ _id: 5971f93be6f98ec60e3dc86c }
  7. console.log(doc);
  8. })
findOne()

該方法返回查找到的所有實例的第一個

</>復制代碼

  1. Model.findOne([conditions], [projection], [options], [callback])

  找出age>20的文檔中的第一個文檔

</>復制代碼

  1. temp.findOne({age:{$gt : 20}},function(err,doc){
  2. //{ _id: 5971f93be6f98ec60e3dc86c, name: "huochai", age: 27 }
  3. console.log(doc);
  4. })
  5. temp.findOne({age:{$gt : 20}}).exec(function(err,doc){
  6. //{ _id: 5971f93be6f98ec60e3dc86c, name: "huochai", age: 27 }
  7. console.log(doc);
  8. })

 找出age>20的文檔中的第一個文檔,且只輸出name字段

</>復制代碼

  1. temp.findOne({age:{$gt : 20}},{name:1,_id:0},function(err,doc){
  2. //{ name: "huochai" }
  3. console.log(doc);
  4. })
  5. temp.findOne({age:{$gt : 20}},{name:1,_id:0}).exec(function(err,doc){
  6. //{ name: "huochai" }
  7. console.log(doc);
  8. })

  找出age>20的文檔中的第一個文檔,且輸出包含name字段在內的最短字段

</>復制代碼

  1. temp.findOne({age:{$gt : 20}},"name",{lean:true},function(err,doc){
  2. //{ _id: 5971f93be6f98ec60e3dc86c, name: "huochai" }
  3. console.log(doc);
  4. })
  5. temp.findOne({age:{$gt : 20}},"name").lean().exec(function(err,doc){
  6. //{ _id: 5971f93be6f98ec60e3dc86c, name: "huochai" }
  7. console.log(doc);
  8. })

 文檔查詢中,常用的查詢條件如下

</>復制代碼

  1. $or    或關系
  2. $nor    或關系取反
  3. $gt    大于
  4. $gte    大于等于
  5. $lt    小于
  6. $lte    小于等于
  7. $ne    不等于
  8. $in    在多個值范圍內
  9. $nin    不在多個值范圍內
  10. $all    匹配數組中多個值
  11. $regex   正則,用于模糊查詢
  12. $size   匹配數組大小
  13. $maxDistance 范圍查詢,距離(基于LBS)
  14. $mod    取模運算
  15. $near    鄰域查詢,查詢附近的位置(基于LBS)
  16. $exists   字段是否存在
  17. $elemMatch 匹配內數組內的元素
  18. $within   范圍查詢(基于LBS)
  19. $box     范圍查詢,矩形范圍(基于LBS)
  20. $center   范圍醒詢,圓形范圍(基于LBS)
  21. $centerSphere 范圍查詢,球形范圍(基于LBS)
  22. $slice    查詢字段集合中的元素(比如從第幾個之后,第N到第M個元素
$where

  如果要進行更復雜的查詢,需要使用$where操作符,$where操作符功能強大而且靈活,它可以使用任意的JavaScript作為查詢的一部分,包含JavaScript表達式的字符串或者JavaScript函數

使用字符串

temp.find({$where:"this.x == this.y"},function(err,docs){

</>復制代碼

  1. //[ { _id: 5972ed35e6f98ec60e3dc887,name: "wang",age: 18,x: 1,y: 1 },
  2. //{ _id: 5972ed35e6f98ec60e3dc889, name: "li", age: 20, x: 2, y: 2 } ]
  3. console.log(docs);

})
temp.find({$where:"obj.x == obj.y"},function(err,docs){

</>復制代碼

  1. //[ { _id: 5972ed35e6f98ec60e3dc887,name: "wang",age: 18,x: 1,y: 1 },
  2. //{ _id: 5972ed35e6f98ec60e3dc889, name: "li", age: 20, x: 2, y: 2 } ]
  3. console.log(docs);

})

使用函數

</>復制代碼

  1. temp.find({$where:function(){
  2. return obj.x !== obj.y;
  3. }},function(err,docs){
  4. //[ { _id: 5972ed35e6f98ec60e3dc886,name: "huochai",age: 27,x: 1,y: 2 },
  5. //{ _id: 5972ed35e6f98ec60e3dc888, name: "huo", age: 30, x: 2, y: 1 } ]
  6. console.log(docs);
  7. })

</>復制代碼

  1. temp.find({$where:function(){
  2. return this.x !== this.y;
  3. }},function(err,docs){
  4. //[ { _id: 5972ed35e6f98ec60e3dc886,name: "huochai",age: 27,x: 1,y: 2 },
  5. //{ _id: 5972ed35e6f98ec60e3dc888, name: "huo", age: 30, x: 2, y: 1 } ]
  6. console.log(docs);
  7. })

文檔更新

文檔更新可以使用以下幾種方法

</>復制代碼

  1. update()
  2. updateMany()
  3. find() + save()
  4. updateOne()
  5. findOne() + save()
  6. findByIdAndUpdate()
  7. fingOneAndUpdate()
update()

  第一個參數conditions為查詢條件,第二個參數doc為需要修改的數據,第三個參數options為控制選項,第四個參數是回調函數

</>復制代碼

  1. Model.update(conditions, doc, [options], [callback])

  options有如下選項

</>復制代碼

  1. safe (boolean): 默認為true。安全模式。
  2.   upsert (boolean): 默認為false。如果不存在則創建新記錄。
  3.   multi (boolean): 默認為false。是否更新多個查詢記錄。
  4.   runValidators: 如果值為true,執行Validation驗證。
  5.   setDefaultsOnInsert: 如果upsert選項為true,在新建時插入文檔定義的默認值。
  6.   strict (boolean): 以strict模式進行更新。
  7.   overwrite (boolean): 默認為false。禁用update-only模式,允許覆蓋記錄。

  數據庫temps中現有數據如下

現在使用update()方法查詢age大于20的數據,并將其年齡更改為40歲

</>復制代碼

  1. var mongoose = require("mongoose");
  2. mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {
  3. if(!err){
  4. var schema = new mongoose.Schema({ age:Number, name: String});
  5. var temp = mongoose.model("temp", schema);
  6. temp.update({age:{$gte:20}},{age:40},function(err,raw){
  7. //{ n: 1, nModified: 1, ok: 1 }
  8. console.log(raw);
  9. })
  10. }
  11. });

  經過以上操作,數據庫結果如下。只有第一個數據更改為40歲。而第三個數據沒有發生變化

  如果要同時更新多個記錄,需要設置options里的multi為true。下面將名字中有"a"字符的年齡設置為10歲

</>復制代碼

  1. var mongoose = require("mongoose");
  2. mongoose.connect("mongodb://u1:123456@localhost/db1", function(err) {
  3. if(!err){
  4. var schema = new mongoose.Schema({ age:Number, name: String});
  5. var temp = mongoose.model("temp", schema);
  6. temp.update({name:/a/},{age: 10},{multi:true},function(err,raw){
  7. //{ n: 2, nModified: 2, ok: 1 }
  8. console.log(raw);
  9. })
  10. }
  11. });

如果設置的查找條件,數據庫里的數據并不滿足,默認什么事都不發生

</>復制代碼

  1. temp.update({age:100},{name: "hundred"},function(err,raw){
  2. //{ n: 0, nModified: 0, ok: 1 }
  3. console.log(raw);
  4. })

  如果設置options里的upsert參數為true,若沒有符合查詢條件的文檔,mongo將會綜合第一第二個參數向集合插入一個新的文檔

</>復制代碼

  1. temp.update({age:100},{name: "hundred"},{upsert:true},function(err,raw){
  2. //{ n: 1, nModified: 0,upserted: [ { index: 0, _id: 5972c202d46b621fca7fc8c7 } ], ok: 1 }
  3. console.log(raw);
  4. })

</>復制代碼

  1. temp.update({name:/aa/},{age: 0},{upsert:true},function(err,raw){
  2. //{ n: 1, nModified: 0,upserted: [ { index: 0, _id: 5972c288d46b621fca7fdd8f } ], ok: 1 }
  3. console.log(raw);
  4. })

 [注意]update()方法中的回調函數不能省略,否則數據不會被更新。如果回調函數里并沒有什么有用的信息,則可以使用exec()簡化代碼

</>復制代碼

  1. temp.update({name:/aa/},{age: 0},{upsert:true}).exec();
updateMany()

 updateMany()與update()方法唯一的區別就是默認更新多個文檔,即使設置{multi:false}也無法只更新第一個文檔

</>復制代碼

  1. Model.updateMany(conditions, doc, [options], [callback])

  將數據庫中名字中帶有"huo"的數據,年齡變為50歲

</>復制代碼

  1. temp.updateMany({name:/huo/},{age:50},function(err,raw){
  2. //{ n: 2, nModified: 2, ok: 1 }
  3. console.log(raw);
  4. });

find() + save()

如果需要更新的操作比較復雜,可以使用find()+save()方法來處理,比如找到年齡小于30歲的數據,名字后面添加"30"字符

</>復制代碼

  1. temp.find({age:{$lt:20}},function(err,docs){
  2. //[ { _id: 5971f93be6f98ec60e3dc86d, name: "wang", age: 10 },
  3. //{ _id: 5971f93be6f98ec60e3dc86f, name: "li", age: 12 }]
  4. console.log(docs);
  5. docs.forEach(function(item,index,arr){
  6. item.name += "30";
  7. item.save();
  8. })
  9. //[ { _id: 5971f93be6f98ec60e3dc86d, name: "wang30", age: 10 },
  10. // { _id: 5971f93be6f98ec60e3dc86f, name: "li30", age: 12 }]
  11. console.log(docs);
  12. });
updateOne()

updateOne()方法只能更新找到的第一條數據,即使設置{multi:true}也無法同時更新多個文檔

  將數據庫中名字中帶有"huo"的數據,年齡變為60歲

</>復制代碼

  1. temp.updateOne({name:/huo/},{age:60},function(err,raw){
  2. //{ n: 1, nModified: 1, ok: 1 }
  3. console.log(raw);
  4. });

findOne() + save()

  如果需要更新的操作比較復雜,可以使用findOne()+save()方法來處理,比如找到名字為"huochai"的數據,年齡加100歲

</>復制代碼

  1. temp.findOne({name:"huochai"},function(err,doc){
  2. //{ _id: 5971f93be6f98ec60e3dc86c, name: "huochai", age: 10 }
  3. console.log(doc);
  4. doc.age += 100;
  5. doc.save();
  6. //{ _id: 5971f93be6f98ec60e3dc86c, name: "huochai", age: 110 }
  7. console.log(doc);
  8. });
findOneAndUpdate()

  fineOneAndUpdate()方法的第四個參數回調函數的形式如下function(err,doc){}

</>復制代碼

  1. Model.findOneAndUpdate([conditions], [update], [options], [callback])
findByIdAndUpdate

   fineByIdAndUpdate()方法的第四個參數回調函數的形式如下function(err,doc){}

</>復制代碼

  1. Model.findOneAndUpdate([conditions], [update], [options], [callback])

文檔刪除

  有三種方法用于文檔刪除

</>復制代碼

  1. remove()
  2. findOneAndRemove()
  3. findByIdAndRemove()
remove()

  remove有兩種形式,一種是文檔的remove()方法,一種是Model的remove()方法

  下面介紹Model的remove()方法,該方法的第一個參數conditions為查詢條件,第二個參數回調函數的形式如下function(err){}  

</>復制代碼

  1. model.remove(conditions, [callback])

  刪除數據庫中名稱包括"30"的數據

</>復制代碼

  1. temp.remove({name:/30/},function(err){})

 [注意]remove()方法中的回調函數不能省略,否則數據不會被刪除。當然,可以使用exec()方法來簡寫代碼

</>復制代碼

  1. temp.remove({name:/30/}).exec()

  下面介紹文檔的remove()方法,該方法的參數回調函數的形式如下function(err,doc){}

</>復制代碼

  1. document.remove([callback])

  刪除數據庫中名稱包含"huo"的數據

  [注意]文檔的remove()方法的回調函數參數可以省略

</>復制代碼

  1. temp.find({name:/huo/},function(err,doc){
  2. doc.forEach(function(item,index,arr){
  3. item.remove(function(err,doc){
  4. //{ _id: 5971f93be6f98ec60e3dc86c, name: "huochai", age: 30 }
  5. //{ _id: 5971f93be6f98ec60e3dc86e, name: "huo", age: 60 }
  6. console.log(doc);
  7. })
  8. })
  9. })

findOneAndRemove()

model的remove()會刪除符合條件的所有數據,如果只刪除符合條件的第一條數據,則可以使用model的findOneAndRemove()方法

</>復制代碼

  1. Model.findOneAndRemove(conditions, [options], [callback])

  集合temps現有數據如下

 現在刪除第一個年齡小于20的數據

</>復制代碼

  1. temp.findOneAndRemove({age:{$lt:20}},function(err,doc){
  2. //{ _id: 5972d3f3e6f98ec60e3dc873, name: "wang", age: 18 }
  3. console.log(doc);
  4. })

與model的remove()方法相同,回調函數不能省略,否則數據不會被刪除。當然,可以使用exec()方法來簡寫代碼

</>復制代碼

  1. temp.findOneAndRemove({age:{$lt:20}}).exec()
findByIdAndRemove()

</>復制代碼

  1. Model.findByIdAndRemove(id, [options], [callback])

刪除第0個元素

</>復制代碼

  1. var aIDArr = [];
  2. temp.find(function(err,docs){
  3. docs.forEach(function(item,index,arr){
  4. aIDArr.push(item._id);
  5. })
  6. temp.findByIdAndRemove(aIDArr[0],function(err,doc){
  7. //{ _id: 5972d754e6f98ec60e3dc882, name: "huochai", age: 27 }
  8. console.log(doc);
  9. })
  10. })

 類似的,該方法也不能省略回調函數,否則數據不會被刪除。當然,可以使用exec()方法來簡寫代碼

</>復制代碼

  1. var aIDArr = [];
  2. temp.find(function(err,docs){
  3. docs.forEach(function(item,index,arr){
  4. aIDArr.push(item._id);
  5. })
  6. temp.findByIdAndRemove(aIDArr[0]).exec()
  7. })

前后鉤子

 前后鉤子即pre()和post()方法,又稱為中間件,是在執行某些操作時可以執行的函數。中間件在schema上指定,類似于靜態方法或實例方法等

  可以在數據庫執行下列操作時,設置前后鉤子

</>復制代碼

  1. validate
  2. save
  3. remove
  4. count
  5. find
  6. findOne
  7. findOneAndRemove
  8. findOneAndUpdate
  9. insertMany
  10. update
pre()

  以find()方法為例,在執行find()方法之前,執行pre()方法

</>復制代碼

  1. var schema = new mongoose.Schema({ age:Number, name: String,x:Number,y:Number});
  2. schema.pre("find",function(next){
  3. console.log("我是pre方法1");
  4. next();
  5. });
  6. schema.pre("find",function(next){
  7. console.log("我是pre方法2");
  8. next();
  9. });
  10. var temp = mongoose.model("temp", schema);
  11. temp.find(function(err,docs){
  12. console.log(docs[0]);
  13. })
  14. /*
  15. 我是pre方法1
  16. 我是pre方法2
  17. { _id: 5972ed35e6f98ec60e3dc886,name: "huochai",age: 27,x: 1,y: 2 }
  18. */
post()

  post()方法并不是在執行某些操作后再去執行的方法,而在執行某些操作前最后執行的方法,post()方法里不可以使用next()

</>復制代碼

  1. var schema = new mongoose.Schema({ age:Number, name: String,x:Number,y:Number});
  2. schema.post("find",function(docs){
  3. console.log("我是post方法1");
  4. });
  5. schema.post("find",function(docs){
  6. console.log("我是post方法2");
  7. });
  8. var temp = mongoose.model("temp", schema);
  9. temp.find(function(err,docs){
  10. console.log(docs[0]);
  11. })
  12. /*
  13. 我是post方法1
  14. 我是post方法2
  15. { _id: 5972ed35e6f98ec60e3dc886,name: "huochai",age: 27,x: 1,y: 2 }
  16. */

查詢后處理

常用的查詢后處理的方法如下所示

</>復制代碼

  1. sort 排序
  2. skip 跳過
  3. limit 限制
  4. select 顯示字段
  5. exect 執行
  6. count 計數
  7. distinct 去重

</>復制代碼

  1. var schema = new mongoose.Schema({ age:Number, name: String,x:Number,y:Number});
  2. var temp = mongoose.model("temp", schema);
  3. temp.find(function(err,docs){
  4. //[ { _id: 5972ed35e6f98ec60e3dc886,name: "huochai",age: 27,x: 1,y: 2 },
  5. //{ _id: 5972ed35e6f98ec60e3dc887,name: "wang",age: 18,x: 1,y: 1 },
  6. //{ _id: 5972ed35e6f98ec60e3dc888, name: "huo", age: 30, x: 2, y: 1 },
  7. //{ _id: 5972ed35e6f98ec60e3dc889, name: "li", age: 20, x: 2, y: 2 } ]
  8. console.log(docs);
  9. })
sort()

  按age從小到大排序

</>復制代碼

  1. temp.find().sort("age").exec(function(err,docs){
  2. //[ { _id: 5972ed35e6f98ec60e3dc887,name: "wang",age: 18,x: 1,y: 1 },
  3. //{ _id: 5972ed35e6f98ec60e3dc889, name: "li", age: 20, x: 2, y: 2 },
  4. //{ _id: 5972ed35e6f98ec60e3dc886,name: "huochai",age: 27,x: 1,y: 2 },
  5. //{ _id: 5972ed35e6f98ec60e3dc888, name: "huo", age: 30, x: 2, y: 1 } ]
  6. console.log(docs);
  7. });

  按x從小到大,age從大到小排列

</>復制代碼

  1. temp.find().sort("x -age").exec(function(err,docs){
  2. //[ { _id: 5972ed35e6f98ec60e3dc886,name: "huochai",age: 27,x: 1,y: 2 },
  3. //{ _id: 5972ed35e6f98ec60e3dc887,name: "wang",age: 18,x: 1,y: 1 },
  4. //{ _id: 5972ed35e6f98ec60e3dc888, name: "huo", age: 30, x: 2, y: 1 },
  5. //{ _id: 5972ed35e6f98ec60e3dc889, name: "li", age: 20, x: 2, y: 2 } ]
  6. console.log(docs);
  7. });
skip()

  跳過1個,顯示其他

</>復制代碼

  1. temp.find().skip(1).exec(function(err,docs){
  2. //[ { _id: 5972ed35e6f98ec60e3dc887,name: "wang",age: 18,x: 1,y: 1 },
  3. //{ _id: 5972ed35e6f98ec60e3dc888, name: "huo", age: 30, x: 2, y: 1 },
  4. //{ _id: 5972ed35e6f98ec60e3dc889, name: "li", age: 20, x: 2, y: 2 } ]
  5. console.log(docs);
  6. });
limit()

  顯示2個

</>復制代碼

  1. temp.find().limit(2).exec(function(err,docs){
  2. //[ { _id: 5972ed35e6f98ec60e3dc886,name: "huochai",age: 27,x: 1,y: 2 },
  3. //{ _id: 5972ed35e6f98ec60e3dc887,name: "wang",age: 18,x: 1,y: 1 } ]
  4. console.log(docs);
  5. });
select()

  顯示name、age字段,不顯示_id字段

</>復制代碼

  1. temp.find().select("name age -_id").exec(function(err,docs){
  2. //[ { name: "huochai", age: 27 },{ name: "wang", age: 18 },{ name: "huo", age: 30 },{ name: "li", age: 20 } ]
  3. console.log(docs);
  4. });

</>復制代碼

  1. temp.find().select({name:1, age:1, _id:0}).exec(function(err,docs){
  2. //[ { name: "huochai", age: 27 },{ name: "wang", age: 18 },{ name: "huo", age: 30 },{ name: "li", age: 20 } ]
  3. console.log(docs);
  4. });

  下面將以上方法結合起來使用,跳過第1個后,只顯示2個數據,按照age由大到小排序,且不顯示_id字段

</>復制代碼

  1. temp.find().skip(1).limit(2).sort("-age").select("-_id").exec(function(err,docs){
  2. //[ { name: "huochai", age: 27, x: 1, y: 2 },
  3. //{ name: "li", age: 20, x: 2, y: 2 } ]
  4. console.log(docs);
  5. });
count()

  顯示集合temps中的文檔數量

</>復制代碼

  1. temp.find().count(function(err,count){
  2. console.log(count);//4
  3. });
distinct()

  返回集合temps中的x的值

</>復制代碼

  1. temp.find().distinct("x",function(err,distinct){
  2. console.log(distinct);//[ 1, 2 ]
  3. });

文檔驗證

為什么需要文檔驗證呢?以一個例子作為說明,schema進行如下定義

</>復制代碼

  1. var schema = new mongoose.Schema({ age:Number, name: String,x:Number,y:Number});

  如果不進行文檔驗證,保存文檔時,就可以不按照Schema設置的字段進行設置,分為以下幾種情況

  1、缺少字段的文檔可以保存成功

</>復制代碼

  1. var temp = mongoose.model("temp", schema);
  2. new temp({age:10}).save(function(err,doc){
  3. //{ __v: 0, age: 10, _id: 597304442b70086a1ce3cf05 }
  4. console.log(doc);
  5. });

  2、包含未設置的字段的文檔也可以保存成功,未設置的字段不被保存

</>復制代碼

  1. new temp({age:100,abc:"abc"}).save(function(err,doc){
  2. //{ __v: 0, age: 100, _id: 5973046a2bb57565b474f48b }
  3. console.log(doc);
  4. });

  3、包含字段類型與設置不同的字段的文檔也可以保存成功,不同字段類型的字段被保存為設置的字段類型

</>復制代碼

  1. new temp({age:true,name:10}).save(function(err,doc){
  2. //{ __v: 0, age: 1, name: "10", _id: 597304f7a926033060255366 }
  3. console.log(doc);
  4. });

  而通過文檔驗證,就可以避免以下幾種情況發生

  文檔驗證在SchemaType中定義,格式如下

</>復制代碼

  1. {name: {type:String, validator:value}}

  常用驗證包括以下幾種

</>復制代碼

  1. required: 數據必須填寫
  2. default: 默認值
  3. validate: 自定義匹配
  4. min: 最小值(只適用于數字)
  5. max: 最大值(只適用于數字)
  6. match: 正則匹配(只適用于字符串)
  7. enum: 枚舉匹配(只適用于字符串)
required

  將age設置為必填字段,如果沒有age字段,文檔將不被保存,且出現錯誤提示

</>復制代碼

  1. var schema = new mongoose.Schema({ age:{type:Number,required:true}, name: String,x:Number,y:Number});
  2. var temp = mongoose.model("temp", schema);
  3. new temp({name:"abc"}).save(function(err,doc){
  4. //Path `age` is required.
  5. console.log(err.errors["age"].message);
  6. });
default

  設置age字段的默認值為18,如果不設置age字段,則會取默認值

</>復制代碼

  1. var schema = new mongoose.Schema({ age:{type:Number,default:18}, name:String,x:Number,y:Number});
  2. var temp = mongoose.model("temp", schema);
  3. new temp({name:"a"}).save(function(err,doc){
  4. //{ __v: 0, name: "a", _id: 59730d2e7a751d81582210c1, age: 18 }
  5. console.log(doc);
  6. });
min | max

  將age的取值范圍設置為[0,10]。如果age取值為20,文檔將不被保存,且出現錯誤提示

</>復制代碼

  1. var schema = new mongoose.Schema({ age:{type:Number,min:0,max:10}, name: String,x:Number,y:Number});
  2. var temp = mongoose.model("temp", schema);
  3. new temp({age:20}).save(function(err,doc){
  4. //Path `age` (20) is more than maximum allowed value (10).
  5. console.log(err.errors["age"].message);
  6. });
match

  將name的match設置為必須存在"a"字符。如果name不存在"a",文檔將不被保存,且出現錯誤提示

</>復制代碼

  1. var schema = new mongoose.Schema({ age:Number, name:{type:String,match:/a/},x:Number,y:Number});
  2. var temp = mongoose.model("temp", schema);
  3. new temp({name:"bbb"}).save(function(err,doc){
  4. //Path `name` is invalid (bbb).
  5. console.log(err.errors["name"].message);
  6. });
enum

  將name的枚舉取值設置為["a","b","c"],如果name不在枚舉范圍內取值,文檔將不被保存,且出現錯誤提示

</>復制代碼

  1. var schema = new mongoose.Schema({ age:Number, name:{type:String,enum:["a","b","c"]},x:Number,y:Number});
  2. var temp = mongoose.model("temp", schema);
  3. new temp({name:"bbb"}).save(function(err,doc){
  4. //`bbb` is not a valid enum value for path `name`.
  5. console.log(err.errors["name"].message);
  6. });
validate

  validate實際上是一個函數,函數的參數代表當前字段,返回true表示通過驗證,返回false表示未通過驗證。利用validate可以自定義任何條件。比如,定義名字name的長度必須在4個字符以上

</>復制代碼

  1. var validateLength = function(arg){
  2. if(arg.length > 4){
  3. return true;
  4. }
  5. return false;
  6. };
  7. var schema = new mongoose.Schema({ name:{type:String,validate:validateLength}, age:Number,x:Number,y:Number});
  8. var temp = mongoose.model("temp", schema);
  9. new temp({name:"abc"}).save(function(err,doc){
  10. //Validator failed for path `name` with value `abc`
  11. console.log(err.errors["name"].message);
  12. });

練習

本節引用 mongoose的基本使用 有刪改

連接數據庫

編輯 test.js :

</>復制代碼

  1. var mongoose = require("mongoose");
  2. var db = mongoose.connect("mongodb://127.0.0.1:27017/test");
  3. db.connection.on("error", function(error){
  4. console.log("數據庫test連接失敗:" + error);
  5. });
  6. db.connection.on("open", function(){
  7. console.log("數據庫test連接成功");
  8. });

接著先打開一個 iTerm2 終端,開啟 mongodb 服務:

</>復制代碼

  1. mongod

再打開另一個 iTerm2 終端,運行 test.js:

</>復制代碼

  1. node test.js
  2. //成功后便會輸出:數據庫test連接成功
Schema/Model/Entity

沒有比文檔更詳細的了:http://mongoosejs.com/docs/gu...

</>復制代碼

  1. Schema:數據庫集合的結構對象。
    Model :由Schema構造而成,可操作數據庫。
    Entity:由Model創建的實體,可操作數據庫。

看完文檔后,再看看下面一段代碼配合理解一下:

</>復制代碼

  1. var mongoose = require("mongoose");
  2. var db = mongoose.connect("mongodb://127.0.0.1:27017/test");
  3. // var testModel = db.model("test1", testSchema); // 集合名稱;集合的結構對象
  4. var TestSchema = new mongoose.Schema({
  5. name : { type:String },
  6. age : { type:Number, default:0 },
  7. email: { type:String },
  8. time : { type:Date, default:Date.now }
  9. });
  10. var TestModel = db.model("test1", TestSchema );
  11. var TestEntity = new TestModel({
  12. name : "helloworld",
  13. age : 28,
  14. email: "helloworld@qq.com"
  15. });
  16. TestEntity.save(function(error,doc){
  17. if(error){
  18. console.log("error :" + error);
  19. }else{
  20. console.log(doc);
  21. }
  22. });
model 數據插入

在前面的數據庫連接成功的前提下,我們在數據庫 test 下新建一個集合 test1 、并往里面插入保存一組數據:

</>復制代碼

  1. var testSchema = new mongoose.Schema({
  2. name: {type: String},
  3. age: {type: Number, default: 0},
  4. email: {type: String},
  5. time: {type: Date, default: Date.now}
  6. });
  7. var testModel = db.model("test1", testSchema); // 集合名稱;集合的結構對象
  8. // Document文檔(關聯數組式的對象) < Collection集合 < 數據庫
  9. // 插入保存一段數據
  10. testModel.create([
  11. {name: "test1", age: 8},
  12. {name: "test2", age: 18},
  13. {name: "test3", age: 28},
  14. {name: "test4", age: 38},
  15. {name: "test5", age: 48},
  16. {name: "test6", age: 58, email:"tttt@qq.com"},
  17. {name: "test7", age: 68, email:"ssss@qq.com"},
  18. {name: "test8", age: 18},
  19. {name: "test9", age: 18, email:"rrrr@qq.com"},
  20. {name: "test10",age: 18}
  21. ], function (error, docs) {
  22. if(error) {
  23. console.log(error);
  24. } else {
  25. console.log("save ok");
  26. console.log(docs);
  27. }
  28. });
find 數據查詢

mongoose 提供了find、findOne、和findById方法用于文檔查詢。
基本語法:

</>復制代碼

  1. model.find(Conditions,fields,options,callback(err, doc));
  2. // Conditions: 查詢條件
  3. // fields: 返回的字段
  4. // options: 游標(sort,limit)
  5. // callback: 回調函數,參數doc為查詢出來的結果

條件查詢的基礎:

</>復制代碼

  1. $lt (小于<)
    $lte (小于等于<=)
    $gt (大于>)
    $gte (大于等于>=)
    $ne (不等于,不包含!=)
    $in (包含)
    $or (查詢多個鍵值的任意給定值)
    $exists (判斷某些屬性是否存在)
    $all (全部)

具體的一些實例,代碼里已有詳細注釋:

</>復制代碼

  1. // find(Conditions,fields,callback);
  2. // 省略或為空、返回所有記錄;只包含name,age字段,去掉默認的_id字段;執行回調函數
  3. testModel.find({}, {name:1, age:1, _id:0}, function(err, docs){
  4. if (err) {
  5. console.log("查詢出錯:" + err);
  6. } else {
  7. console.log("{}查詢結果為:");
  8. console.log(docs);
  9. }
  10. });
  11. ----
  12. {}查詢結果為:
  13. [ { name: "test3", age: 28 },
  14. { name: "test2", age: 18 },
  15. { name: "test1", age: 8 },
  16. { name: "test6", age: 58 },
  17. { name: "test4", age: 38 },
  18. { name: "test7", age: 68 },
  19. { name: "test8", age: 18 },
  20. { name: "test9", age: 18 },
  21. { name: "test5", age: 48 },
  22. { name: "test10", age: 18 } ]
  23. ----
  24. // 查詢age大于等于28,小于等于48
  25. testModel.find({age: {$gte: 28, $lte: 48}}, {name:1, age:1, _id:0}, function(err, docs){
  26. if (err) {
  27. console.log("查詢出錯:" + err);
  28. } else {
  29. console.log("$gte,$lte查詢結果為:");
  30. console.log(docs);
  31. }
  32. });
  33. ----
  34. $gte,$lte查詢結果為:
  35. [ { name: "test3", age: 28 },
  36. { name: "test4", age: 38 },
  37. { name: "test5", age: 48 } ]
  38. ----
  39. // 查詢age為58、68的2條數據
  40. testModel.find({age: {$in: [58, 68]}}, {name:1, age:1, _id:0}, function(err, docs){
  41. if (err) {
  42. console.log("查詢出錯:" + err);
  43. } else {
  44. console.log("$in查詢結果為:");
  45. console.log(docs);
  46. }
  47. });
  48. ----
  49. $in查詢結果為:
  50. [ { name: "test6", age: 58 }, { name: "test7", age: 68 } ]
  51. ----
  52. // 查詢name為test3、或者age為18的全部數據
  53. testModel.find({$or: [{name: "test3"}, {age: 18}]}, {name:1, age:1, _id:0}, function(err, docs){
  54. if (err) {
  55. console.log("查詢出錯:" + err);
  56. } else {
  57. console.log("$or查詢結果為:");
  58. console.log(docs);
  59. }
  60. });
  61. ----
  62. $or查詢結果為:
  63. [ { name: "test3", age: 28 },
  64. { name: "test2", age: 18 },
  65. { name: "test8", age: 18 },
  66. { name: "test9", age: 18 },
  67. { name: "test10", age: 18 } ]
  68. ----
  69. // step3:游標查詢
  70. // 查詢name為test3、或者age為18的全部數據;但限制只查詢2條數據
  71. testModel.find({$or: [{name: "test3"}, {age: 18}]}, {name:1, age:1, _id:0}, {limit: 2}, function(err, docs){
  72. if (err) {
  73. console.log("查詢出錯:" + err);
  74. } else {
  75. console.log("limit查詢結果為:");
  76. console.log(docs);
  77. }
  78. });
  79. ----
  80. limit查詢結果為:
  81. [ { name: "test3", age: 28 }, { name: "test2", age: 18 } ]
  82. ----
  83. //查詢age大于等于28,小于等于48;降序輸出
  84. testModel.find({age: {$gte: 28, $lte: 48}}, {name:1, age:1, _id:0}, {sort: {age: -1}}, function(err, docs){
  85. if (err) {
  86. console.log("查詢出錯:" + err);
  87. } else {
  88. console.log("sort查詢結果為:");
  89. console.log(docs);
  90. }
  91. });
  92. ----
  93. sort查詢結果為:
  94. [ { name: "test5", age: 48 },
  95. { name: "test4", age: 38 },
  96. { name: "test3", age: 28 } ]
  97. ----
update 數據更新

基本使用:model.update(查詢條件,更新對象,callback);

</>復制代碼

  1. var conditions = {name: "test1"};
  2. var update = {$set: {age: 11 }};
  3. testModel.update(conditions, update, function(error){
  4. if(error) {
  5. console.log(error);
  6. } else {
  7. console.log("Update success!");
  8. testModel.find({name: "test1"}, {name:1, age:1, _id:0}, function(err, docs){
  9. if (err) {
  10. console.log("查詢出錯:" + err);
  11. } else {
  12. console.log("更新test1后的查詢結果為:");
  13. console.log(docs);
  14. // 更新test_update后的查詢結果為空數組:[ ];
  15. // 更新test1后的查詢結果為: [ { name: "test1", age: 11 } ]
  16. // 只能更新本來已存在的數據
  17. }
  18. });
  19. }
  20. ---
  21. Update success!
  22. 更新test1后的查詢結果為:
  23. [ { name: "test1", age: 11 } ]
  24. ---
remove 數據刪除

基本使用:model.remove(查詢條件,callback);

</>復制代碼

  1. var conditions = {name: "test2"};
  2. testModel.remove(conditions, function(error){
  3. if(error) {
  4. console.log(error);
  5. } else {
  6. console.log("Delete success!");
  7. testModel.find({name: "test2"}, {name:1, age:1, _id:0}, function(err, docs){
  8. if (err) {
  9. console.log("查詢出錯:" + err);
  10. } else {
  11. console.log("刪除test2后的查詢結果為:");
  12. console.log(docs); // 刪除test2后的查詢結果為空數組:[ ];
  13. }
  14. });
  15. }
  16. });
  17. ----
  18. Delete success!
  19. 刪除test2后的查詢結果為:
  20. []
  21. ----

參考引用

http://mongoosejs.com

Mongoose簡要API

Nodejs學習筆記(十四)— Mongoose介紹和入門

Mongoose基礎入門

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/17658.html

相關文章

  • GraphQL 搭配 Koa 最佳入門實踐

    摘要:如下圖嗯,如圖都已經查詢到我們保存的全部數據,并且全部返回前端了。如圖沒錯,什么都沒有就是查詢服務的界面。寫好了之后我們在配置一下路由,進入里面,加入下面幾行代碼。 GraphQL一種用為你 API 而生的查詢語言,2018已經到來,PWA還沒有大量投入生產應用之中就已經火起來了,GraphQL的應用或許也不會太遠了。前端的發展的最大一個特點就是變化快,有時候應對各種需求場景的變化,不...

    MoAir 評論0 收藏0
  • 「全棧初探」- Mongoose的簡單使用

    摘要:下載依賴包完成項目創建,項目結構連接數據庫在根目錄下創建,輸入以下代碼,監聽的幾個事件,如果以上操作都沒錯的話,那么就會監聽第一個事件事件,表示連接數據庫成功,在最后,我們導出對象,以供其他模塊使用。 一、準備工作 1. 啟動mongo數據庫 關于下載安裝啟動數據庫我這里就不做過多解釋,谷歌下會有很多教程,啟動成功后的命令窗如下所示: showImg(https://segmentfa...

    vboy1010 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<