从MongoDB中读取MongoDB时,如何判断空数组和空/未定义值之间的区别? Mongoose读取为空数组,但在数据库中我必须使用它们的含义是不同的。
示例:
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 }
所以Mongoose设置一个空数组,从数据库中读取时不应该有一个数组。 我已经尝试在post init hook中将name设置为undefined,但它没有显示任何效果。
我有什么想法可以读取这个undef作为undef?
答案 0 :(得分:2)
Mongoose总是将数组属性初始化为空数组。
您可以检查names
属性是否存在以及length
属性是否0
:
if (doc.names && doc.names.length) {
// Do something if there is at least one item in the names array.
}
检查通过短路进行:
doc.names
不存在,则结果为undefined
,这是假的。这会导致跳过if
块。doc.names
存在并且是真实的,那么if块会评估doc.names
的长度属性。如果此长度为0
或不存在,则if
块中的布尔表达式为false,并跳过if
块。