亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mongoose中document與object有什么區別

發布時間:2021-02-03 16:03:15 來源:億速云 閱讀:161 作者:Leah 欄目:web開發

這篇文章將為大家詳細講解有關Mongoose中document與object有什么區別,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

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>
 <h2><%= title %></h2>
 <p>Welcome to <%= title %></p>
 <!-- <%= docs %> -->
 <ul>
 <% docs.forEach(function(doc){ %>
 <li><%= doc.type %></li>
 <% }) %>
 </ul>
 </body>
</html>

在第一段代碼中,通過model.find我們應該能夠獲取到根據queryCriteria獲取的結果,結果應該是一個對象數組,類似于這樣:

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

預期index.ejs應該渲染的頁面是一個ul渲染的結果,類似于

  • 2室1廳

  • 2室2廳

當然,理想很豐滿,現實很骨感。我就是死活渲染不出來doc.type。照理說應該是不可能的,在index.ejs中doc就是一個對象,我為什么不能獲取doc的type屬性呢?這不合理,太不合理了!

老實說,這個問題我之間也是遇到過,當初我是想修改這個doc的屬性,但是死活沒有辦法修改,當初也是花了很久找到原因。這次我就把這個問題好好地研究一下。

先說結果,以及解決方法把。我比較喜歡劇透。愿意是因為再次返回的doc是屬于Document的實例,而不是一個普通的對象。也就是說它和普通的對象是不一樣的,它沒有普通對象的一些方法,普通對象也沒有它身上的一些方法。

解決方案有幾種,不過究其根本都是將這種document轉化為普通的對象:

方法1:

利用toObject方法

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

方法2:

利用JSON方法,這是我想到的一個方法,具體深層原因在這就不展開了:

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

方法3:

利用lean方法:

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

上述的三種方法應該都能成功將find獲取的結果轉化為普通的對象。

但是我還想知道到底document和一個普通的對象到底有什么區別,區別在哪里呢?

我們假設find獲取的結果是docs,轉化為普通對象的結果是docs1。現在我們就看一看這二者的區別。理論上docs和docs1都應該是數組,而它們中元素都應該是一個對象,我們先來看看是不是這樣呢?

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]))

我們通過上述方法可以獲取docs以及docs1的類型以及其中元素的類型,結果是:

[object Array]
[object Object]

[object Array]
[object Object]

和我們預想中的一模一樣,那問題不在這,那我們就探究探究docs[0]以及docs1[0]的原型把,看看它的原型到底是什么呢?知道JS的人,應該都知道JS中的原型鏈。在此,我們就通過__proto__來粗暴地獲取對象的原型:

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

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

結果是:

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 } }

以及

{}

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

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

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

關于Mongoose中document與object有什么區別就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高邮市| 昭通市| 南华县| 潞西市| 济南市| 尖扎县| 弋阳县| 大关县| 行唐县| 施甸县| 彭水| 黄大仙区| 聂拉木县| 巨野县| 屏东市| 井陉县| 桦甸市| 萝北县| 临泉县| 兴安县| 桂平市| 黑河市| 岢岚县| 社会| 凌云县| 博爱县| 临猗县| 拉孜县| 新泰市| 贡山| 台前县| 银川市| 云阳县| 怀仁县| 阿坝县| 南陵县| 扶绥县| 图片| 龙江县| 荔浦县| 大关县|