确定Mongoose中空数组和未定义之间的区别

时间:2016-02-02 10:10:31

标签: javascript node.js mongodb mongoose

从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?

1 个答案:

答案 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.
}

检查通过短路进行:

  1. 如果doc.names不存在,则结果为undefined,这是假的。这会导致跳过if块。
  2. 如果doc.names存在并且是真实的,那么if块会评估doc.names的长度属性。如果此长度为0或不存在,则if块中的布尔表达式为false,并跳过if块。