MongoDB使用点语法查询空值

时间:2019-05-20 05:32:07

标签: mongodb mongodb-query aggregation-framework

在使用dot syntax of mongo向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时,它基本上抵消了整个语句,但是我不知道如何解决这个问题。

MongoDB v3.4.10

1 个答案:

答案 0 :(得分:1)

您可以使用$expr使用聚合运算符,然后使用$arrayElemAtnull共有$eq的第一个索引

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

MongoPlayground

对于 3.6

之前的mongo版本
db.collection.aggregate([
  { "$addFields": {
    "match": { "$arrayElemAt": ["$a.value", 0] }
  }},
  { "$match": { "match": null }}
])

MongoPlayground

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

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

MongoPlayground