首页 新闻 会员 周边

关于在MongoDB中使用$type查询Array类型数据的一些问题

0
[待解决问题]

关于在MongoDB中使用$type查询Array类型数据的一些问题

问题关键词

mongo查询数据类型$typearray数组

问题简述

在使用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", 
        []
    ]
}

想要解决的问题

  1. 上述的问题是否是正常的现象?

    关于这一点,我翻阅过官方文档MongoDB--$type,其中给出过类似的案例和描述,但是我觉得不够详细,没有解决我的困惑。

  2. 我该如何精准的查询指定字段是某个类型的数据?

    还是用上例举例:如果我要查询informations字段为数组的文档,如何能够查询到文档3~文档7;如果我要查询informations字段为字符串的文档,如何能够只查询到文档2,而不包含文档5和文档7。

    另外特此说明:我并不确定informations字段的值是什么,所以没有办法指定某个确切的值来查询文档。

小小垂髫的主页 小小垂髫 | 菜鸟二级 | 园豆:202
提问于:2022-12-02 10:49
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册