2016-02-02 61 views
3

如何從使用Mongoose的MongoDB中讀取數據時區分空數組和空值/未定義值? Mongoose同時讀取爲空數組,但在數據庫中,我必須使用這些數據庫的含義是不同的。確定Mongoose中空數組和undefined之間的差異

實施例:

var Mongoose = require('mongoose'); 
var MongoClient = require('mongodb').MongoClient; 

Mongoose.connect('mongodb://localhost/test'); // mongoose 
var Demo = Mongoose.model('demo', { names: [String] }, 'demo'); 

MongoClient.connect('mongodb://localhost/test', function (err, db) { 
    if (err) return console.error(err); 
    var collection = db.collection('demo'); 

    // insert undefined array with MongoDB: 
    collection.insert({}, function(err, status) { 
    if(err) return console.error(err); 
    console.log('direct DB:', status.ops[0]); 

    // retrieve with Mongoose: 
    Demo.findOne({_id: status.insertedIds[0]}, function(err, doc) { 
     if(err) return console.error(err); 
     console.log('Mongoose:', doc); 
    }); 
    }); 
}); 

當運行該代碼,它導致這樣的輸出:

direct DB: { _id: 56b07f632390b15c15b4185d } 
Mongoose: { names: [], _id: 56b07f632390b15c15b4185d } 

所以貓鼬設置空數組那裏不應該從讀取時成爲一個數據庫。 我已經嘗試設置名稱爲未定義在後init初始化,但它沒有顯示任何效果。

任何想法如何我可以讀取這個undef作爲一個undef?

+1

可能不是您想要聽到的答案,但正確的答案是在您的模式中添加一個單獨的布爾字段,以指示您的null數組字段旨在表示的任何內容。 – JohnnyHK

回答

2

Mongoose總是將數組屬性初始化爲一個空數組。

您可以檢查names屬性是否存在以及其length屬性不0

if (doc.names && doc.names.length) { 
    // Do something if there is at least one item in the names array. 
} 

支票作品短路:

  1. 如果doc.names不存在,結果是undefined這是狡猾的。這會導致if塊被跳過。
  2. 如果doc.names存在且是真的,則if塊評估doc.names的長度屬性。如果此長度爲0或不存在,則if塊中的布爾表達式爲false,並跳過if塊。
+0

這怎麼能說明數據庫中不存在的屬性的區別? – hoeni

+1

但是'doc.names'存在*和* ist truthy,儘管數據庫中沒有names屬性。這正是我的問題:-) – hoeni