MongoDB 使用点语法查询空值



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

MongoDBv3.4.10

您可以使用$expr来使用聚合运算符,然后使用$arrayElemAt查找第一个索引,该索引$eqnull

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语法,则必须使用$type运算符与null值进行比较

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

蒙戈游乐场

最新更新