我有一个数据库,其中包含两种结构的文档:
{
"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"是数组(。
我做错了什么?
来自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
以下是Mongo游乐场上的一个工作演示:https://mongoplayground.net/p/3ri7Bjfrae8