我有一个包含两种结构的文档的数据库:
{
"name": "",
"name_ar": "",
"description": "",
"bla1": {
"name": "",
"link": "",
"Logo": ""
},
"bla2": {
"name": "",
"id": ""
}
}
和
{
"name": "",
"name_ar": "",
"description": "",
"bla1": {
"name": [],
"link": "",
"Logo": ""
},
"bla2": {
"name": "",
"id": ""
}
}
我想查询我的集合以获取与“ bla1.name”完全相同的文档。但是,使用以下查询:
{$and: [{'bla1.name': {'$type': 'string'}}, {"bla1.name":'something'}]}
返回所有包含名称“ something”的文档(即使“ bla1.name”是数组)。
我在做什么错了?
答案 0 :(得分:2)
来自MongoDB文档:
$ type现在可以像处理其他BSON类型一样使用数组。以前的版本仅匹配字段包含嵌套数组的文档。
这意味着:如果数组中至少有一个具有给定类型的元素,它将被选中。
如果要排除数组作为类型,则必须扩展查询。由于查询已匹配字符串,因此可以排除字符串的类型选择:
$and: [
// not necessary any more, as this selection is already implied by the last part
// {
// "bla1.name": {
// "$type": "string"
// }
// },
{
"bla1.name": {
$not: {
"$type": "array"
}
}
}, {
"bla1.name": "something"
}
]
请参阅官方文档:https://docs.mongodb.com/manual/reference/operator/query/type/#behavior
以下是蒙哥游乐场的工作演示:https://mongoplayground.net/p/3ri7Bjfrae8