【问题标题】:Why $ne: null returning the empty arrays?为什么 $ne: null 返回空数组?
【发布时间】:2021-09-15 17:43:46
【问题描述】:

我正在尝试返回具有内容但 $ne: null 或 $exsists: true 仍然返回空数组的数组..

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 会返回每个不存在秘密数组的文档,但如果它是一个空数组,那为什么呢?任何建议如何克服这个菜鸟问题?我是新来的,请客气! :)

【问题讨论】:

    标签: javascript mongodb mongoose ejs


    【解决方案1】:

    如果文档包含 secret 字段的值,其中包括缺失/未定义、null、空数组和填充数组,您可以选择仅匹配填充数组:

    {$eval:{$gt:[0,{$size:"$secret"}]}}- get the size for thesecrets` 数组,并且只匹配非空数组。

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

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

    【讨论】:

      【解决方案2】:

      这是因为null != []。 你必须明确地写出你的条件来处理这两种情况。

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

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

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

      【讨论】:

      • 谢谢图沙尔!这对你很有帮助。我用谷歌搜索了很多,但没有找到 $nin。你解决了我的问题。 :)
      猜你喜欢
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 2022-12-26
      • 2016-07-25
      • 2016-12-28
      • 1970-01-01
      • 2012-08-26
      相关资源
      最近更新 更多