使用点语法对null进行MongoDB查询

使用点语法对null进行MongoDB查询,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我在使用查询mongodb的空值时遇到问题 数据库中的某些内容: db.things.insertMany([ { a: [{ value: 1 }] }, { a: [{ value: null }] }, { a: [{ value: 2 }] } ]); 我想找到所有在“a”数组中第一个元素为空值的文档 查询: db.getCollection('things').count({“a.0.value”:1})=>1(如预期的那样) db.getCollection('t

我在使用查询mongodb的空值时遇到问题

数据库中的某些内容:

db.things.insertMany([
   { a: [{ value: 1 }] },
   { a: [{ value: null }] },
   { a: [{ value: 2 }] }
]);
我想找到所有在“a”数组中第一个元素为空值的文档

查询:

db.getCollection('things').count({“a.0.value”:1})
=>1(如预期的那样)
db.getCollection('things').count({“a.0.value”:null})
=>3(这里也应该是1)

我有点不明白为什么这会返回第二个查询的所有元素。它似乎只对数组索引结果有这种行为,这也让它有点奇怪。(例如
db.getCollection('things').count({“a”:null})
=>0如预期)

我能想到的唯一一件事是,当它的值为null时,它基本上会取消整个语句,但我不知道如何避免这个问题

MongoDBv3.4.10

您可以使用聚合运算符,然后找到第一个索引,使用该索引可以
null

db.collection.find({ "$expr": { "$eq": [{ "$arrayElemAt": ["$a.value", 0] }, null] } })

对于3.6之前的mongo版本

db.collection.aggregate([
  { "$addFields": {
    "match": { "$arrayElemAt": ["$a.value", 0] }
  }},
  { "$match": { "match": null }}
])

如果您甚至想使用
.dot
语法进行检查,则必须使用运算符与
null
值进行比较

db.collection.find({ "a.0.value": { "$type": 10 } })

嘿,我想如果我在一个新的mongo中,这会起作用,但我在3.4.10中。你知道那个版本有没有类似的东西吗?事实上,即使使用3.6,我也没有得到任何查询结果(我使用这个repl:)你知道为什么点语法适用于其他东西而不是null吗?再次更新了我的答案