最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mongoose中document與object的區(qū)別示例詳解

 更新時(shí)間:2017年09月18日 10:17:18   作者:neal  
這篇文章主要給大家介紹了關(guān)于Mongoose中document與object區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

前言

本文主要給大家總結(jié)介紹了關(guān)于Mongoose中document與object區(qū)別的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),其實(shí)這個(gè)問(wèn)題其實(shí)是mongoose非常常見(jiàn)的問(wèn)題,經(jīng)常有很多以前沒(méi)遇到這個(gè)問(wèn)題的人都會(huì)被這個(gè)問(wèn)題弄得懷疑人生。

我們先介紹一些問(wèn)題的背景。

先看下面一段代碼:

router.get('/', function(req, res, next) {
 // res.render('index', { title: 'Express' });
 const model = mongoose.model('realestate');
 const queryCretia = {};
 model.find(queryCretia, (err, docs) => {
 res.render('index', {
 title: 'express',
 docs: docs
 })
 })
});
<!DOCTYPE html>
<html>
 <head>
 <title><%= title %></title>
 <link rel='stylesheet' href='/stylesheets/style.css' />
 </head>
 <body>
 <h1><%= title %></h1>
 <p>Welcome to <%= title %></p>
 <!-- <%= docs %> -->
 <ul>
 <% docs.forEach(function(doc){ %>
 <li><%= doc.type %></li>
 <% }) %>
 </ul>
 </body>
</html>

在第一段代碼中,通過(guò)model.find我們應(yīng)該能夠獲取到根據(jù)queryCriteria獲取的結(jié)果,結(jié)果應(yīng)該是一個(gè)對(duì)象數(shù)組,類(lèi)似于這樣:

[{
 "_id" : ObjectId("59bdeadb2a5c612514ee7970"),
 "title" : "好樓層,中等裝修,滿5年,上門(mén)實(shí)拍",
 "type" : "2室1廳",
 "square" : "75.42平",
 "direction" : "朝南",
 "floor" : "中區(qū)/6層",
 "unitPrice" : 47732,
 "totalPrice" : 360,
 "location" : null,
 "specialExplain" : "滿五",
 "url" : "http://sh.lianjia.com//ershoufang/sh4528035.html",
 "station" : "江楊北路",
 "line" : "3號(hào)線",
 "updateTime" : "2017-09-17 11:24:11"
}
{
 "_id" : ObjectId("59bdeadb2a5c612514ee7971"),
 "title" : "南北戶型,廚衛(wèi)全明,高區(qū)采光好,裝修精美",
 "type" : "2室2廳",
 "square" : "90.92平",
 "direction" : "朝南北",
 "floor" : "高區(qū)/6層",
 "unitPrice" : 46194,
 "totalPrice" : 420,
 "location" : null,
 "specialExplain" : "滿五",
 "url" : "http://sh.lianjia.com//ershoufang/sh4546221.html",
 "station" : "江楊北路",
 "line" : "3號(hào)線",
 "updateTime" : "2017-09-17 11:24:11"
}]

預(yù)期index.ejs應(yīng)該渲染的頁(yè)面是一個(gè)ul渲染的結(jié)果,類(lèi)似于

  • 2室1廳
  • 2室2廳

當(dāng)然,理想很豐滿,現(xiàn)實(shí)很骨感。我就是死活渲染不出來(lái)doc.type。照理說(shuō)應(yīng)該是不可能的,在index.ejs中doc就是一個(gè)對(duì)象,我為什么不能獲取doc的type屬性呢?這不合理,太不合理了!

老實(shí)說(shuō),這個(gè)問(wèn)題我之間也是遇到過(guò),當(dāng)初我是想修改這個(gè)doc的屬性,但是死活沒(méi)有辦法修改,當(dāng)初也是花了很久找到原因。這次我就把這個(gè)問(wèn)題好好地研究一下。

先說(shuō)結(jié)果,以及解決方法把。我比較喜歡劇透。愿意是因?yàn)樵俅畏祷氐膁oc是屬于Document的實(shí)例,而不是一個(gè)普通的對(duì)象。也就是說(shuō)它和普通的對(duì)象是不一樣的,它沒(méi)有普通對(duì)象的一些方法,普通對(duì)象也沒(méi)有它身上的一些方法。

解決方案有幾種,不過(guò)究其根本都是將這種document轉(zhuǎn)化為普通的對(duì)象:

方法1:

利用toObject方法

docs.forEach(doc => {
 return doc.toObject();
})

方法2:

利用JSON方法,這是我想到的一個(gè)方法,具體深層原因在這就不展開(kāi)了:

docs = JSON.stringify(docs);
docs = JSON.parse(docs);

方法3:

利用lean方法:

model.find().lean().exec((err, docs) => {
....
})

上述的三種方法應(yīng)該都能成功將find獲取的結(jié)果轉(zhuǎn)化為普通的對(duì)象。

但是我還想知道到底document和一個(gè)普通的對(duì)象到底有什么區(qū)別,區(qū)別在哪里呢?

我們假設(shè)find獲取的結(jié)果是docs,轉(zhuǎn)化為普通對(duì)象的結(jié)果是docs1?,F(xiàn)在我們就看一看這二者的區(qū)別。理論上docs和docs1都應(yīng)該是數(shù)組,而它們中元素都應(yīng)該是一個(gè)對(duì)象,我們先來(lái)看看是不是這樣呢?

console.log(Object.prototype.toString.call(docs));
consoele.log(Object.prototype.toString.call(docs[0]));

console.log(Object.prototype.toString.call(docs1));
console.log(Object.prototype.toString.call(docs1[0]))

我們通過(guò)上述方法可以獲取docs以及docs1的類(lèi)型以及其中元素的類(lèi)型,結(jié)果是:

[object Array]
[object Object]

[object Array]
[object Object]

和我們預(yù)想中的一模一樣,那問(wèn)題不在這,那我們就探究探究docs[0]以及docs1[0]的原型把,看看它的原型到底是什么呢?知道JS的人,應(yīng)該都知道JS中的原型鏈。在此,我們就通過(guò)__proto__來(lái)粗暴地獲取對(duì)象的原型:

console.dir(doc[0].__proto__);

console.dir(docs[0].__proto__);

結(jié)果是:

model {
 db:
 NativeConnection {
  base:
  Mongoose {
  connections: [Array],
  models: [Object],
  modelSchemas: [Object],
  options: [Object],
  plugins: [Array] },
  collections: { realestates: [Object] },
  models: { realestate: [Object] },
  config: { autoIndex: true },
  replica: false,
  hosts: null,
  host: '127.0.0.1',
  port: 27017,
  user: undefined,
  pass: undefined,
  name: 'real_estate_info',
  options:
  { db: [Object],
  auth: {},
  server: [Object],
  replset: [Object],
  mongos: undefined },
  otherDbs: [],
  _readyState: 1,
  _closeCalled: false,
  _hasOpened: true,
  _listening: false,
  db:
  Db {
  domain: null,
  _events: [Object],
  _eventsCount: 6,
  _maxListeners: undefined,
  s: [Object],
  serverConfig: [Getter],
  bufferMaxEntries: [Getter],
  databaseName: [Getter],
  _listening: true },
  _events:
  { connected: [Function],
  error: [Function: bound bound consoleCall],
  disconnected: [Function: bound bound consoleCall],
  reconnected: [Function: bound bound consoleCall] },
  _eventsCount: 4 },
 discriminators: undefined,
 id: [Getter/Setter],
 __v: [Getter/Setter],
 _id: [Getter/Setter],
 schema:
 Schema {
  obj: undefined,
  paths: { _id: [Object], __v: [Object] },
  aliases: {},
  subpaths: {},
  virtuals: { id: [Object] },
  singleNestedPaths: {},
  nested: {},
  inherits: {},
  callQueue: [ [Array], [Array], [Array], [Array], [Array], [Array] ],
  _indexes: [],
  methods: {},
  statics: {},
  tree: { _id: [Object], __v: [Function: Number], id: [Object] },
  query: {},
  childSchemas: [],
  plugins: [ [Object], [Object], [Object], [Object] ],
  s: { hooks: [Object], kareemHooks: [Object] },
  options:
  { retainKeyOrder: false,
  typeKey: 'type',
  id: true,
  noVirtualId: false,
  _id: true,
  noId: false,
  validateBeforeSave: true,
  read: null,
  shardKey: null,
  autoIndex: null,
  minimize: true,
  discriminatorKey: '__t',
  versionKey: '__v',
  capped: false,
  bufferCommands: true,
  strict: true,
  pluralization: true },
  '$globalPluginsApplied': true,
  _requiredpaths: [] },
 collection:
 NativeCollection {
  collection: Collection { s: [Object] },
  opts: { bufferCommands: true, capped: false },
  name: 'realestates',
  collectionName: 'realestates',
  conn:
  NativeConnection {
  base: [Object],
  collections: [Object],
  models: [Object],
  config: [Object],
  replica: false,
  hosts: null,
  host: '127.0.0.1',
  port: 27017,
  user: undefined,
  pass: undefined,
  name: 'real_estate_info',
  options: [Object],
  otherDbs: [],
  _readyState: 1,
  _closeCalled: false,
  _hasOpened: true,
  _listening: false,
  db: [Object],
  _events: [Object],
  _eventsCount: 4 },
  queue: [],
  buffer: false,
  emitter:
  EventEmitter {
  domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined } },
 '$__original_save': { [Function] numAsyncPres: 0 },
 save: { [Function: wrappedPointCut] '$originalFunction': '$__original_save', '$isWrapped': true },
 _pres:
 { '$__original_save': [ [Object], [Object], [Object] ],
  '$__original_remove': [ [Object] ] },
 _posts: { '$__original_save': [], '$__original_remove': [] },
 '$__original_remove': { [Function] numAsyncPres: 1 },
 remove:
 { [Function: wrappedPointCut]
  '$originalFunction': '$__original_remove',
  '$isWrapped': true },
 '$__original_validate': [Function],
 validate:
 { [Function: wrappedPointCut]
  '$originalFunction': '$__original_validate',
  '$isWrapped': true } }

以及

{}

很顯然,問(wèn)題就是在這里,docs[0]和docs[0]的原型并不是一個(gè)東西。而js中對(duì)象通過(guò).或者是[]訪問(wèn)屬性都是調(diào)用了Object中的某個(gè)方法,但具體什么方法我不太記得。然而docs中的原型或者其原型的原型也是沒(méi)有這個(gè)方法的,因此他就沒(méi)辦法去訪問(wèn)這個(gè)屬性。

其實(shí)docs[0].__proto__.__proto__是Model,docs[0].__proto__.__proto__.__proto__是Document,docs[0].__proto__.__proto__.__proto__.__proto__才是{}。

至此,這個(gè)問(wèn)題引起的一系列的探究也是告一段落了。其實(shí)Mongoose還有另外一些奇怪的地方,被人所詬病,在此也不一一細(xì)數(shù)了。從問(wèn)題的發(fā)現(xiàn),到寫(xiě)這篇文章大概花了大半天的時(shí)間,以前遇到問(wèn)題就找到解決辦法就停止了,但是這一次通過(guò)這樣深入地去發(fā)現(xiàn),可能就會(huì)發(fā)掘到更多的東西。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:

相關(guān)文章

  • 詳解如何在Node.js中正確處理async/await及數(shù)組迭代

    詳解如何在Node.js中正確處理async/await及數(shù)組迭代

    在使用?Node.js?開(kāi)發(fā)應(yīng)用程序時(shí),我們常常需要處理異步操作,在這種情況下,我們通常會(huì)使用?async/await?語(yǔ)法來(lái)簡(jiǎn)化異步編程的復(fù)雜性,下面小編就來(lái)和大家聊聊如何正確處理async/await吧
    2024-12-12
  • Node.js中Bootstrap-table的兩種分頁(yè)的實(shí)現(xiàn)方法

    Node.js中Bootstrap-table的兩種分頁(yè)的實(shí)現(xiàn)方法

    這篇文章主要介紹了Node.js中Bootstrap-table的兩種分頁(yè)的使用方法,需要的朋友可以參考下
    2017-09-09
  • yarn?命令死循環(huán)問(wèn)題分析解決

    yarn?命令死循環(huán)問(wèn)題分析解決

    這篇文章主要為大家介紹了yarn?命令死循環(huán)問(wèn)題分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Node.js?npm?安裝過(guò)程中EBUSY錯(cuò)誤的分析與解決方案

    Node.js?npm?安裝過(guò)程中EBUSY錯(cuò)誤的分析與解決方案

    使用?npm?進(jìn)行安裝是一個(gè)非常常見(jiàn)的操作,npm在安裝過(guò)程中可能出現(xiàn)EBUSY錯(cuò)誤,本文就來(lái)介紹一下如何解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-01-01
  • 如何用nodejs搭建代理服務(wù)器

    如何用nodejs搭建代理服務(wù)器

    這篇文章主要介紹了如何用nodejs搭建代理服務(wù)器,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 讓你的Node.js應(yīng)用程序處理數(shù)百萬(wàn)的API請(qǐng)求技巧

    讓你的Node.js應(yīng)用程序處理數(shù)百萬(wàn)的API請(qǐng)求技巧

    歡迎閱讀關(guān)于優(yōu)化 NodeJS 應(yīng)用以處理數(shù)百萬(wàn) API 請(qǐng)求的終極指南,如果你是一名開(kāi)發(fā)人員,希望擴(kuò)展應(yīng)用,那么你來(lái)對(duì)地方了,在這篇博客中,我們將深入研究最佳實(shí)踐和技術(shù),幫助你處理高流量負(fù)載,確保應(yīng)用保持性能和響應(yīng)速度
    2023-10-10
  • nodejs制作小爬蟲(chóng)功能示例

    nodejs制作小爬蟲(chóng)功能示例

    這篇文章主要介紹了nodejs制作小爬蟲(chóng)功能,結(jié)合實(shí)例形式分析了node.js安裝request、cheerio模塊及請(qǐng)求發(fā)送、數(shù)據(jù)庫(kù)操作等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2020-02-02
  • npm?install報(bào)錯(cuò)unable?to?resolve?dependency?tree的解決辦法

    npm?install報(bào)錯(cuò)unable?to?resolve?dependency?tree的解決辦法

    在開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)使用npm安裝依賴包來(lái)加速開(kāi)發(fā),但是在執(zhí)行npm install命令時(shí),有時(shí)會(huì)遇到各種錯(cuò)誤,下面這篇文章主要給大家介紹了關(guān)于npm?install報(bào)錯(cuò)unable?to?resolve?dependency?tree的解決辦法,需要的朋友可以參考下
    2023-05-05
  • npm 常用命令詳解(小結(jié))

    npm 常用命令詳解(小結(jié))

    這篇文章主要介紹了npm 常用命令詳解(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • node微信小程序登錄實(shí)現(xiàn)登錄的項(xiàng)目實(shí)踐

    node微信小程序登錄實(shí)現(xiàn)登錄的項(xiàng)目實(shí)踐

    登陸流程是指小程序用戶進(jìn)行授權(quán)登陸,即獲取用戶的微信賬號(hào)等信息本文就來(lái)介紹一下node微信小程序登錄實(shí)現(xiàn)登錄,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09

最新評(píng)論

高尔夫| 响水县| 如东县| 射洪县| 英吉沙县| 鸡西市| 石楼县| 左云县| 三都| 西乌| 左权县| 黄山市| 深泽县| 静宁县| 会泽县| 开远市| 罗田县| 赤峰市| 昭通市| 鲁甸县| 南城县| 玉田县| 江津市| 东海县| 大理市| 洞头县| 天峻县| 松潘县| 蒙城县| 新竹县| 清远市| 徐水县| 长岛县| 志丹县| 桐乡市| 开江县| 宁河县| 枞阳县| 合山市| 阿图什市| 普兰店市|