在使用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
答案 0 :(得分:1)
您可以使用$expr
使用聚合运算符,然后使用$arrayElemAt
与null
共有$eq
的第一个索引
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 } })