MongoDB空查询异常

MongoDB空查询异常,mongodb,Mongodb,查看以下查询: db.models.findOne({ "value.userId": { $ne: null } }, { "value.userId":1}).value.userId == null 上面说: 查找具有非空用户id字段的记录 在结果中返回用户id 将该值与null进行比较 因为我们只返回没有空值的记录,所以将结果与空值进行比较应该总是返回false。然而,这总是返回真的 如果我只是执行.findOne(…)并打印它,而不是执行比较,我会得到: { "_id": 4, "

查看以下查询:

 db.models.findOne({ "value.userId": { $ne: null } }, { "value.userId":1}).value.userId == null
上面说:

  • 查找具有非空用户id字段的记录
  • 在结果中返回用户id
  • 将该值与null进行比较
  • 因为我们只返回没有空值的记录,所以将结果与空值进行比较应该总是返回false。然而,这总是返回真的

    如果我只是执行.findOne(…)并打印它,而不是执行比较,我会得到:

    { "_id": 4, "value": { "userId": null }
    
    有人知道这是怎么回事吗

    编辑:这个字段的“类型”显然是6-而不是10,这是空值应该是什么。
    EDIT2:显然,类型6是“未定义的”-不确定为什么它会打印null…

    这里的问题是,当您尝试打印
    未定义的
    值时,MongoDB会打印
    null
    ,而不是向您发出错误

    请参见此示例:-

    > db.foo.save({"amount": undefined})
    > db.foo.find({"amount": {$ne: null}})
    { "_id" : ObjectId("50d0d3a1511dd1035f01c636"), "amount" : null }
    
    因此,正如您所说,
    userId
    的类型是
    6
    ,它用于
    未定义的
    ,因此它打印
    null
    。另外,它是
    $ne:null
    ,因此它也是匹配的

    请参阅此链接:-


    但是,如果您在
    null
    中看到相同的行为,您将得到所需的结果:-

    > db.foo.save({"amount": null})
    > db.foo.findOne({"amount": {$ne: null}}) 
    null
    

    真奇怪。因为,它给了我预期的结果。你确定这是这样工作的吗?肯定的…刚刚运行了这个:db.models.findOne({“value.userId”):{$ne:null}}.value.userId,它返回null。现在这很烦人。@jvenema。好吧,这看起来很烦人,但实际上这个功能非常有用,当你不小心试图打印一个未定义的字段时,在这种情况下你不会得到错误。MongoDB就是这样设计的。我知道它是这样设计的,但行为应该是一致的——要么以相同的方式打印并过滤空值和未定义的值(两者),要么不打印,但不要以一种方式打印,然后过滤另一种…@jvenema。。实际上,一个字段是
    未定义的
    ,要么给它显式值
    未定义
    ,要么它根本不在文档中。因此,当然不能基于不存在的字段进行筛选,即
    不存在
    未定义
    字段不能等于
    null
    。Sorta-在find()调用中,不能对null==未定义进行筛选,但在控制台中可以对它们进行比较(请参阅我的原始问题-与null比较是真的),对于写入输出来说,它们显然被认为是“足够”相等的-否则您将看到“未定义”而不是“null”作为脚本的输出。问题在于不一致性——在某些情况下,“null”无法进行比较,与“undefined”不同,但在另一些情况下却是如此。