Mongoose增查改刪學(xué)習(xí)筆記

初學(xué)Node.js接觸到MongoDB數(shù)據(jù)庫抱婉,閱讀資料中推薦的都是Mongoose模塊矩桂,可以更加方便的對(duì)數(shù)據(jù)庫進(jìn)行操作,便開始接觸Mongoose证九。在學(xué)習(xí)時(shí)碰到許多基礎(chǔ)問題彭谁,查閱了許多資料理來理解,此篇文章就是以自己的理解允扇,記錄下入門的基礎(chǔ)知識(shí)缠局,以及歸納下常用的函數(shù)以及格式,方便今后查閱考润。
初學(xué)筆記難免有許多不足與錯(cuò)誤歡迎指出狭园。

環(huán)境搭建

安裝MongoDB

如果需要在本地測試,需要先安裝MongoDB數(shù)據(jù)庫糊治。
官網(wǎng)下載最新安裝包唱矛。安裝成功后,在命令行下進(jìn)入MongoDB\bin目錄

mongod --dbpath D:\MongoDB\data

啟動(dòng)數(shù)據(jù)庫井辜。

http://localhost:27017/

在瀏覽器中訪問這地址绎谦,訪問正常則數(shù)據(jù)庫啟動(dòng)成功。
更詳細(xì)的說明可以查看《MongoDB的下載粥脚、安裝與部署》

Node.js中安裝模塊

npm install mongoose

在已經(jīng)安裝過Node.js的電腦上窃肠,進(jìn)入工作目錄輸入以上命令即可安裝Mongoose模塊。

可視化工具

Robomongo

Robomongo是一款不錯(cuò)的可視化工具刷允,Windows冤留、MacOS、Linux平臺(tái)都有树灶,界面也簡潔纤怒。雖然有收費(fèi),普通操作免費(fèi)版足夠用天通。
官網(wǎng)下載

引入與連接

引入模塊

在需要使用的js文件中引入模塊泊窘。

var mongoose = require('mongoose');

連接數(shù)據(jù)庫

var db = mongoose.connect('mongodb://localhost/mongodb');

URL以mongodb:// + [用戶名:密碼@] +數(shù)據(jù)庫地址[:端口] + 數(shù)據(jù)庫名。(默認(rèn)端口27017)
需要對(duì)連接狀況進(jìn)行判斷土砂,可以用以下代碼:

db.connection.on("error", function (error) {  
    console.log("數(shù)據(jù)庫連接失斨菁取:" + error);
});

db.connection.on("open", function () {  
    console.log("數(shù)據(jù)庫連接成功"); 
})

db.connection.on('disconnected', function () {    
    console.log('數(shù)據(jù)庫連接斷開');  
})

基本概念

最常接觸到的有三個(gè)概念SchemaModel萝映、Entity吴叶。按自己理解,
Schema是定義數(shù)據(jù)庫的結(jié)構(gòu)序臂。類似創(chuàng)建表時(shí)的數(shù)據(jù)定義蚌卤,但比創(chuàng)建數(shù)據(jù)庫可以做更多的定義实束,只是沒辦法通過Schema對(duì)數(shù)據(jù)庫進(jìn)行更改。
Model是將Schema定義的結(jié)構(gòu)賦予表名逊彭。但可用此名對(duì)數(shù)據(jù)庫進(jìn)行增刪查改咸灿。
Entity是將Model與具體的數(shù)據(jù)綁定,可以對(duì)具體數(shù)據(jù)自身進(jìn)行操作侮叮,例如保存數(shù)據(jù)避矢。

Schema

Schema用來定義數(shù)據(jù)庫文檔結(jié)構(gòu),數(shù)據(jù)庫有什么字段囊榜、字段是什么類型审胸、默認(rèn)值、主鍵之類的信息卸勺。除了定義結(jié)構(gòu)外砂沛,還能定義文檔的實(shí)例方法,靜態(tài)模型方法曙求,復(fù)合索引碍庵,中間件等。詳情查看mongoose官方文檔悟狱。
在引入Mongoose模塊var mongoose = require('mongoose')的js文件中進(jìn)行操作静浴。

var blogSchema = new mongoose.Schema({
    title:  String,
    comments: [{ body: String, date: Date }],
    date: { type: Date, default: Date.now },
    hidden: Boolean,
    meta: {
        votes: Number,
        favs:  Number
  }
})

這樣即定義了一個(gè)名為blogSchema的Schema。

如需再添加數(shù)據(jù)芽淡,用add方法马绝。

blogSchema.add( { author: String, body: String} );

資料中介紹,Shema不僅定義了文檔的結(jié)構(gòu)和屬性挣菲,還可以定義文檔的插件富稻、實(shí)例方法、靜態(tài)方法白胀、復(fù)合索引文檔生命周期鉤子椭赋,具體還需查看官方文檔。

Schema.Type

Schema.Type是Mongoose內(nèi)部定義的數(shù)據(jù)類型或杠∧恼基本類型有:StringNumber向抢、Date认境、BooleanArray挟鸠、Buffer叉信、MixedObjectId艘希。

Mixed
混合數(shù)據(jù)類型硼身,可以直接定義{}來使用硅急,以下兩種形式等價(jià)。

new Schema({mixed: {Schema.Types.Mixed} });
new Schema({mixed: {} });

ObjectId
儲(chǔ)存在數(shù)據(jù)庫中的每個(gè)數(shù)據(jù)都會(huì)有默認(rèn)的主鍵_id佳遂,默認(rèn)存儲(chǔ)的是ObjectId营袜。
ObjectId是一個(gè)12字節(jié)的BSON類型字符串。按照字節(jié)順序依次代表:
4字節(jié):UNIX時(shí)間戳
3字節(jié):表示運(yùn)行MongoDB的機(jī)器
2字節(jié):表示生成此_id的進(jìn)程
3字節(jié):由一個(gè)隨機(jī)數(shù)開始的計(jì)數(shù)器生成的值

Model

var blogModel = mongoose.model('Blog', blogSchema);

將名為blogSchema的Schema與Blog名字綁定丑罪,即是存入數(shù)據(jù)庫的名字荚板,但存入數(shù)據(jù)庫中的名字是Blogs,會(huì)自動(dòng)添加一個(gè)s吩屹。
這里將Model命名為blogModel啸驯,需要對(duì)Blog表操作的話,都需要使用變量名blogModel祟峦。

Entity

可以綁定具體數(shù)據(jù)對(duì)Model實(shí)例化。

var blogEntity = new blogModel({
    title:  "Mongoose",
    author: "L",
    body:   "Documents are instances of out model. Creating them and saving to the database is easy",
    comments: [{ body: "It's very cool! Thanks a lot!", date: "2014.07.28" }],
    hidden: false,
    meta: {
        votes: 100,
        favs:  99
    }
})

這里將名為blogModel的Model實(shí)例化徙鱼。之后我們可以用blogEntity名對(duì)數(shù)據(jù)進(jìn)行保存并執(zhí)行回調(diào)宅楞。

blogEntity.save(function(err, docs){
    if(err) console.log(err);
    console.log('保存成功:' + docs);
})

在平常使用SQL語句操作數(shù)據(jù)庫時(shí),取得數(shù)據(jù)后先組織成SQL語句袱吆,然后放入執(zhí)行語句中執(zhí)行厌衙。這里理解也是類似,取得數(shù)據(jù)先進(jìn)行實(shí)例化绞绒,這一步類似于組織成SQL語句婶希,然后再做具體操作例如上面的Save操作。但由于Node.js是異步操作蓬衡,所以返回的數(shù)據(jù)利用回調(diào)函數(shù)來進(jìn)行操作喻杈。

知道了以上概念后就可以對(duì)數(shù)據(jù)進(jìn)行操作了,下面將列出一些常用的資料狰晚,并附上相應(yīng)的例子筒饰。

增查改刪(CRUD)

所有的參數(shù)都是以JSON對(duì)象形式傳入。

增(C)

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

var doc = ({
    title:  "Mongoose",
    author: "L",
    body:   "Documents are instances of out model. Creating them and saving to the database is easy",
    comments: [{ body: "It's very cool! Thanks a lot!", date: "2014.07.28" }],
    hidden: false,
    meta: {
        votes: 100,
        favs:  99
    }
};

blogModel.create(doc, function(err, docs){
    if(err) console.log(err);
    console.log('保存成功:' + docs);
});

Model#save([options], [options.safe], [options.validateBeforeSave], [fn])

var blogEntity = new blogModel({
    title:  "Mongoose",
    author: "L",
    body:   "Documents are instances of out model. Creating them and saving to the database is easy",
    comments: [{ body: "It's very cool! Thanks a lot!", date: "2014.07.28" }],
    hidden: false,
    meta: {
        votes: 100,
        favs:  99
    }
});

blogEntity.save(function(err, docs){
    if(err) console.log(err);
    console.log('保存成功:' + docs);
});

Model.insertMany(doc(s), [options], [callback])

多條數(shù)據(jù)插入壁晒,將多條數(shù)據(jù)一次性插入瓷们,相對(duì)于循環(huán)使用create保存會(huì)更加快。

blogModel.insertMany([
    {title: "mongoose1", author: "L"}, 
    {title: "mongoose2", author: "L"}
    ], function(err, docs){
        if(err) console.log(err);
        console.log('保存成功:' + docs);
});

查(R)

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

conditions:查詢條件秒咐;projection:控制返回的字段谬晕;options:控制選項(xiàng);callback:回調(diào)函數(shù)携取。

blogModel.find({title: "Mongoose", meta.votes: 100}, {title: 1, author: 1, body: 1}, function(err, docs){
    if(err) console.log(err);
    console.log('查詢結(jié)果:' + docs);
})

查詢“title”標(biāo)題為“Mongoose”攒钳,并且“meta”中“votes”字段值為“100”的記錄,返回僅返回“title”歹茶、“author”夕玩、“body”三個(gè)字段的數(shù)據(jù)你弦。

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

conditions:查詢條件;projection:控制返回的字段燎孟;options:控制選項(xiàng)禽作;callback:回調(diào)函數(shù)。
只返回第一個(gè)查詢記錄揩页。

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

id:指定_id的值旷偿;projection:控制返回的字段;options:控制選項(xiàng)爆侣;callback:回調(diào)函數(shù)萍程。

改(U)

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

conditions:查詢條件;doc:需要修改的數(shù)據(jù)兔仰,不能修改主鍵(_id)茫负;options:控制選項(xiàng);callback:回調(diào)函數(shù)乎赴,返回的是受影響的行數(shù)忍法。
options有以下選項(xiàng):
  safe (boolean): 默認(rèn)為true。安全模式榕吼。
  upsert (boolean): 默認(rèn)為false饿序。如果不存在則創(chuàng)建新記錄。
  multi (boolean): 默認(rèn)為false羹蚣。是否更新多個(gè)查詢記錄原探。
  runValidators: 如果值為true,執(zhí)行Validation驗(yàn)證顽素。
  setDefaultsOnInsert: 如果upsert選項(xiàng)為true咽弦,在新建時(shí)插入文檔定義的默認(rèn)值。
  strict (boolean): 以strict模式進(jìn)行更新戈抄。
  overwrite (boolean): 默認(rèn)為false离唬。禁用update-only模式,允許覆蓋記錄划鸽。

blogModel.update({title: "Mongoose"}, {author: "L"}, {multi: true}, function(err, docs){
    if(err) console.log(err);
    console.log('更改成功:' + docs);
})

以上代碼先查詢“title”為“Mongoose”的數(shù)據(jù)输莺,然后將它的“author”修改為“L”,“multi”為true允許更新多條查詢記錄裸诽。

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

一次更新多條

Model.updateOne(conditions, doc, [options], [callback])

一次更新一條

Model.findByIdAndUpdate(id, [update], [options], [callback])

id:指定_id的值嫂用;update:需要修改的數(shù)據(jù);options控制選項(xiàng)丈冬;callback回調(diào)函數(shù)嘱函。
options有以下選項(xiàng):
  new: bool - 默認(rèn)為false。返回修改后的數(shù)據(jù)埂蕊。
  upsert: bool - 默認(rèn)為false往弓。如果不存在則創(chuàng)建記錄疏唾。
  runValidators: 如果值為true,執(zhí)行Validation驗(yàn)證函似。
  setDefaultsOnInsert: 如果upsert選項(xiàng)為true槐脏,在新建時(shí)插入文檔定義的默認(rèn)值。
  sort: 如果有多個(gè)查詢條件撇寞,按順序進(jìn)行查詢更新顿天。
  select: 設(shè)置數(shù)據(jù)的返回。

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

conditions:查詢條件蔑担;update:需要修改的數(shù)據(jù)牌废;options控制選項(xiàng);callback回調(diào)函數(shù)啤握。
options有以下選項(xiàng):
  new: bool - 默認(rèn)為false鸟缕。返回修改后的數(shù)據(jù)。
  upsert: bool - 默認(rèn)為false排抬。如果不存在則創(chuàng)建記錄叁扫。
  fields: {Object|String} - 選擇字段。類似.select(fields).findOneAndUpdate()畜埋。
  maxTimeMS: 查詢用時(shí)上限。
  sort: 如果有多個(gè)查詢條件畴蒲,按順序進(jìn)行查詢更新悠鞍。
  runValidators: 如果值為true,執(zhí)行Validation驗(yàn)證模燥。
  setDefaultsOnInsert: 如果upsert選項(xiàng)為true咖祭,在新建時(shí)插入文檔定義的默認(rèn)值。
  passRawResult: 如果為真蔫骂,將原始結(jié)果作為回調(diào)函數(shù)第三個(gè)參數(shù)么翰。

刪(D)

Model.remove(conditions, [callback])

blogModel.remove({author: "L"}, function(err, docs){
    if(err) console.log(err);
    console.log('刪除成功:' + docs);
})

刪除“author”值為“L”的記錄。

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

id:指定_id的值辽旋;update:需要修改的數(shù)據(jù)浩嫌;options控制選項(xiàng);callback回調(diào)函數(shù)补胚。
options有以下選項(xiàng):
  sort: 如果有多個(gè)查詢條件码耐,按順序進(jìn)行查詢更新。
  select: 設(shè)置數(shù)據(jù)的返回溶其。

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

conditions:查詢條件骚腥;update:需要修改的數(shù)據(jù);options控制選項(xiàng)瓶逃;callback回調(diào)函數(shù)束铭。
options有以下選項(xiàng):
  sort: 如果有多個(gè)查詢條件廓块,按順序進(jìn)行查詢更新。
  maxTimeMS: 查詢用時(shí)上限契沫。
  select: 設(shè)置數(shù)據(jù)的返回带猴。

復(fù)雜條件查詢

在之前的查詢說明中僅演示了確定值的查詢,如果遇到更加復(fù)雜的情況就需要使用其他一些方法埠褪。
詳細(xì)的文檔可以在這兒查找 mongodb查詢符浓利。

Query#exec([operation], [callback])

執(zhí)行查詢,回調(diào)函數(shù)钞速。
使用find()贷掖、$where之類查詢返回的是Mongoose自己封裝的Query對(duì)象,使用find()可以在函數(shù)最后接上回調(diào)來獲取查詢到的數(shù)據(jù)渴语。
使用鏈?zhǔn)秸Z句時(shí)苹威,可以在之后接.exec()執(zhí)行查詢,并指定回調(diào)函數(shù)驾凶。

blogModel.find({title: "Mongoose", meta.votes: 100}, {title: 1, author: 1, body: 1}).exec(function(err, docs){
    if(err) console.log(err);
    console.log('查詢結(jié)果:' + docs);
})

配合各種查詢符可以方便的實(shí)現(xiàn)復(fù)雜的查詢牙甫。
比如我需要查詢“title”中以“Mongoose”開頭,并且“meta”中“votes”的值小余100调违。并且按“meta”中“votes”的值升序排序窟哺。

blogModel.and([
    { title: { $regex: "Mongoose.+","$options":"i"}},
    { meta.votes: { $lt: 100}}
).sort({ meta.votes: 1}
).exec(function(err, docs){
    if(err) console.log(err);
    console.log('查詢結(jié)果:' + docs);
});

比較查詢運(yùn)算符

$equals 等于 / $gt 大于 / $gte 大于等于 / $lt 小余 / $lte 小余等于 / $ne 不等于 / $in 在數(shù)組中 / $nin 不在數(shù)組中

blogModel.find({meta.votes: {$lt: 100}});

查詢“meta”中的“votes”字段值小余100的數(shù)據(jù)。

blogModel.find({title: {$in: ['Mongoose', 'Mongodb', 'Nodejs']}});

查詢“title”為“Mongoose”或“Mongodb”或“Nodejs”其中之一的數(shù)據(jù)技肩。

邏輯查詢運(yùn)算符

$or 或 / $and 與 / $nor

blogModel.find({ $and: [
    {meta.votes: {$gte: 50}}, 
    {meta.votes: {$lt: 100}}
]});

查詢“meta”中的“votes”字段值大于等于50到小余100的數(shù)據(jù)且轨。

blogModel.find({ $nor: [
    {meta.votes: 50}, 
    {meta.votes: 100}
]});

查詢“meta”中的“votes”字段值不等于50和不等于100的數(shù)據(jù)。

以上例子也可以寫成這樣形式虚婿,比較清晰旋奢,其他類同

blogModel.and([
    {meta.votes: {$gte: 50}}, 
    {meta.votes: {$lt: 100}}
]);
    
blogModel.nor([
    {meta.votes: 50}, 
    {meta.votes: 100}
]);

元素查詢運(yùn)算符

$exists 查詢的字段值是否存在

blogModel.find({ title: {$exists: true}});
blogModel.where('title').exists(true);

查詢存在“title”字段的數(shù)據(jù)然痊。

評(píng)估查詢運(yùn)算符

$mod 與數(shù)據(jù)進(jìn)行取模運(yùn)算篩選

blogModel.find({ meta.votes: {$mod: [4, 0]}});
blogModel.where('meta.votes').$mod(4, 0);

查找“meta”中的“votes”字段值與4取模后至朗,值為0的數(shù)據(jù)。

$regex 使用正則表達(dá)式查詢數(shù)據(jù)

blogModel.find({ title: { $regex: "Mongoose.+","$options":"i"}});

搜索以“Mongoose”開頭的“title”字段剧浸,“options”中的“i”代表不區(qū)分大小寫锹引。
$options參數(shù)與其余用法可以查看mongodb文檔中 $regex 一節(jié)。

$where 支持js表達(dá)式查詢

blogModel.find({ $where: 'this.comments.length === 10 || this.name.length === 5' });
blogModel.$where(function() { return this.comments.length === 10 || this.name.length === 5; });

數(shù)組查詢運(yùn)算符

Query#all([path], val)  查詢數(shù)組的本身及超集

blogModel.find( tags: ['nodejs', 'mongoose']);

查詢“tags”的字段值同時(shí)包含有['nodejs', 'mongoose']的數(shù)據(jù)唆香。只要值中包含此數(shù)組即返回?cái)?shù)據(jù)粤蝎,若是只包含數(shù)組中的一個(gè)則不返回此數(shù)據(jù)。

Query#elemMatch(path, criteria)  查詢數(shù)組的交集

blogModel.find( $elemMatch: { tags: 'mongoose', author: 'L'});

查詢“tags”為“mongoose”或是“author”為“L”的數(shù)據(jù)袋马。

Query#size([path], val)  查詢指定大小的數(shù)組

blogModel.find( tags: { $size: 2});
blogModel.where('tags').size(2);

查詢“tags”數(shù)組中包含兩個(gè)元素的數(shù)據(jù)初澎。

其他常用的運(yùn)算符

Query#limit(val)  限制查詢返回的數(shù)量

blogModel.find( tags: 'mongoose').limit(5);

查詢“tags”為“mongoose”的數(shù)據(jù),只返回前5個(gè)查詢結(jié)果。

Query#skip(val)  跳過前N個(gè)查詢結(jié)果

blogModel.find( tags: 'mongoose').skip(10).limit(5);

查詢“tags”為“mongoose”的數(shù)據(jù)碑宴,跳過前10個(gè)查詢結(jié)果软啼,返回從第11個(gè)開始的五個(gè)查詢結(jié)果。
做分頁時(shí)常用到這兩個(gè)延柠,但數(shù)據(jù)量過大時(shí)就會(huì)有性能問題祸挪。

Query#sort(arg)  對(duì)結(jié)果按某個(gè)指定字段進(jìn)行排序

1asc為升序贞间,-1贿条、desc為降序≡鋈龋可以對(duì)一個(gè)字段進(jìn)行排序整以,也可以是多個(gè)。

blogModel.find( tags: 'mongoose').skip(10).limit(5).sort("{ meta.votes: 1}");

查詢“tags”為“mongoose”的數(shù)據(jù)峻仇,跳過前10個(gè)查詢結(jié)果公黑,返回從第11個(gè)開始的五個(gè)查詢結(jié)果。之后按“votes”進(jìn)行升序排序摄咆。

Query#count([criteria], [callback])  計(jì)數(shù)

blogModel.count({ title: 'mongoose'}, function(err, docs){});

統(tǒng)計(jì)“title”為“mongoose”數(shù)據(jù)的數(shù)量

Query#select(arg)  選擇指定字段

在查詢中可以選擇指定的查詢字段凡蚜,或者排除指定的字段。+為包含吭从,-為排除朝蜘。

blogModel.select('title body');

只包含“title”、“body”字段涩金。

blogModel.select('-title -body');

排除“title”芹务、“body”字段。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸭廷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子熔吗,更是在濱河造成了極大的恐慌辆床,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桅狠,死亡現(xiàn)場離奇詭異讼载,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)中跌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門咨堤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漩符,你說我怎么就攤上這事一喘。” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵凸克,是天一觀的道長议蟆。 經(jīng)常有香客問我,道長萎战,這世上最難降的妖魔是什么咐容? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蚂维,結(jié)果婚禮上戳粒,老公的妹妹穿的比我還像新娘。我一直安慰自己虫啥,他們只是感情好蔚约,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著孝鹊,像睡著了一般炊琉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上又活,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天苔咪,我揣著相機(jī)與錄音,去河邊找鬼柳骄。 笑死团赏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耐薯。 我是一名探鬼主播舔清,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼曲初!你這毒婦竟也來了体谒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤臼婆,失蹤者是張志新(化名)和其女友劉穎抒痒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颁褂,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡故响,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颁独。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彩届。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖誓酒,靈堂內(nèi)的尸體忽然破棺而出樟蠕,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布坯墨,位于F島的核電站寂汇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捣染。R本人自食惡果不足惜骄瓣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耍攘。 院中可真熱鬧榕栏,春花似錦、人聲如沸蕾各。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽式曲。三九已至妨托,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吝羞,已是汗流浹背兰伤。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钧排,地道東北人敦腔。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像恨溜,于是被迫代替她去往敵國和親符衔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容

  • 參考深入淺出mongoose 連接mongoose mongoose連接數(shù)據(jù)庫有兩種方式第一種: 第二種: mon...
    bacbcc94613b閱讀 12,329評(píng)論 1 27
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,338評(píng)論 0 6
  • Mongodb 配置選項(xiàng) 通常在mongod.conf中 配置文件 設(shè)置了配置文件后啟動(dòng)時(shí)以自定義的配置文件啟動(dòng):...
    AkaTBS閱讀 1,081評(píng)論 0 6
  • 參考資料https://www.npmjs.com/package/mongodbhttps://docs.mon...
    程序員有話說閱讀 755評(píng)論 0 4
  • 感恩周末睡個(gè)懶覺糟袁,舒服判族。謝謝你,謝謝你项戴,謝謝你形帮。 感恩美美的吃了頓豐盛的早餐 ,謝謝你肯尺,謝謝你,謝謝你躯枢。 感恩鄰居...
    王貽賢閱讀 221評(píng)論 0 0