为什么 $ne: null 返回空数组?

Why $ne: null returning the empty arrays?

我正在尝试 return 包含内容但 $ne: null 或 $exsists: true 的数组仍然 return 空数组..

const userSchema = new mongoose.Schema({
email: String, 
password: String, 
googleId: String, 
facebookId: String, 
secret: Array
});

app.get("/secrets", function(req, res) {
User.find({secret: {$ne: null} }, function(err, secrets) {
if (err) {
  console.log(err);
} else {
  if (secrets) {
   console.log(secrets); 
    res.render("secrets", {
      secrets: secrets
    });
   };
  };
 }); 
});

我在谷歌上搜索了很多,我明白 $ne: null 会 return 每个不存在秘密数组的文档,但如果它是一个空数组,那为什么呢?任何建议如何克服这个菜鸟问题?我是新来的,请客气! :)

这是因为null != []。 你必须明确地写下你的条件来处理这两个问题。

$nin 表示不在。因此查找秘密值不在给定数组中的用户。给定的数组可以保存您的多个值。

User.find({secret: {$nin: [null, [] ] } },...

此外,使用 $exists,您甚至可以获得字段为 null 的文档。您唯一得不到的文档是那些根本不存在秘密字段的文档。

如果文档包含 secret 字段的值,其中包括 missing/undefined、null、空数组和填充数组,您有几个选项可以仅匹配填充数组:

{$eval:{$gt:[0,{$size:"$secret"}]}}- get the size for thesecrets`数组,只匹配不为空的数组.

  • {"secret.0":{$exists:true}} - 仅当 secret 数组中有第一个元素时才匹配文档(隐式不匹配非数组字段)

  • 如果secret数组中的元素都是同一类型,则可以使用基于类型的查询。例如,如果秘密数组中的元素是字符串,{"secret.0":{$gte:""}} 将匹配第一个元素是字符串的任何数组。这也可以通过在 {"secret.0":1}

    上创建索引来优化