mongo
、查询
、数据类型
、$type
、array
、数组
;
在使用MongoDB的过程中,我多次遇到了这样的问题,之前一直没有当回事去解决,直到现在,这个问题已经影响到我的工作效率,实在是忍无可忍了。
在mongo中,我们可以使用$type
去查询指定字段符合查询条件的文档,但是我在查询某个字段是数组(Array)的时候,使用查询语句{$type: 4}
却无法将指定的文档查到。
这个我有些懵,mongo装在Linux上,在linux上通过交互页面查询版本为:
3.4.9
但是我在windows上通过Robo3T连接后查询版本为:
4.2.6
查询指令使用的都是version()
。
这个也算是一个不太重要的问题吧。
首先有集合中的文档如下所示,文档的informations
字段的数据类型不同,有整型、字符串和数组。还有部分文档(文档4~文档7)的inforamtions
字段为数组中包含各种数据类型的数据。
db.getCollection("temp_test").insertMany([
{'_id': 1, 'informations': 2000},
{'_id': 2, 'informations': 'Hello MongoDB.'},
{'_id': 3, 'informations': []},
{'_id': 4, 'informations': [2000]},
{'_id': 5, 'informations': ['Hello MongoDB.']},
{'_id': 6, 'informations': [[]]},
{'_id': 7, 'informations': [2000, 'Hello MongoDB', []]},
])
而我遇到的问题是,我想要查询informations
字段的值是数组(Array)类型的文档,也就是文档3至文档7(_id
字段为3~7的文档)这五篇文档。
所以我使用了以下查询语句:
db.getCollection("temp_test").find({
'informations': {'$type': 4},
// 'informations': {'$type': 'array'},
})
但是结果却如下所示:
/* 1 */
{
"_id" : 6.0,
"informations" : [
[]
]
}
/* 2 */
{
"_id" : 7.0,
"informations" : [
2000.0,
"Hello MongoDB",
[]
]
}
使用该指令并不能查询得到informations
为数组的文档,也就是我想要的文档3至文档7这五篇文档,而是查询到了文档6和文档7这两个数组中存在数组的文档。
此外,我还试验了其它几种类型的查询,结果都是这样的:如果查询的字段类型为数组,那么使用$type查询时,不会检查其本身,而是检查其数组中是否包含了指定类型的数据。
其余的案例如下所示:
如果我要查询informations
字段为字符串的类型的数据,那么使用如下查询语句:
db.getCollection("temp_test").find({
'informations': {'$type': 2},
// 'informations': {'$type': 'string'},
})
结果如下所示,不仅查询到了本身就是字符串类型的文档2,而且还查询到了数组中包含字符串类型数据的文档5和文档7(_id
为5和7的文档)。而我只想要文档2。
/* 1 */
{
"_id" : 2.0,
"informations" : "Hello MongoDB."
}
/* 2 */
{
"_id" : 5.0,
"informations" : [
"Hello MongoDB."
]
}
/* 3 */
{
"_id" : 7.0,
"informations" : [
2000.0,
"Hello MongoDB",
[]
]
}
上述的问题是否是正常的现象?
关于这一点,我翻阅过官方文档MongoDB--$type,其中给出过类似的案例和描述,但是我觉得不够详细,没有解决我的困惑。
我该如何精准的查询指定字段是某个类型的数据?
还是用上例举例:如果我要查询informations
字段为数组的文档,如何能够查询到文档3~文档7;如果我要查询informations
字段为字符串的文档,如何能够只查询到文档2,而不包含文档5和文档7。
另外特此说明:我并不确定informations
字段的值是什么,所以没有办法指定某个确切的值来查询文档。