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": 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”不同,但在另一些情况下却是如此。