mongo:$ type在mongo find查询中不起作用

时间:2017-02-02 13:46:51

标签: java spring mongodb spring-boot

我的mongo文档看起来像这样:

{
    "_id" : ObjectId(abcd),
    "ratingComment" : {
        "_id" : NumberLong(1000),
        "comment" : "Test comment"
    }
}

我想将ratingComment字段转换为数组类型字段。所以我这样做了:

db.getCollection('ratingsAndReview').find({}).forEach(function(doc){doc.ratingComment=[doc.ratingComment];db.ratingsAndReview.save(doc);})

在此查询之后,我注意到某些文档仍然具有旧结构,而ratingComment字段不是数组。

所以现在他们混合了上述结构和下面的结构:

{
    "_id" : ObjectId(abcd),
    "ratingComment" : [
        {
            "_id" : NumberLong(1000),
            "comment" : "Test comment"
        }
    ]
}

然后,我希望检索所有包含reviewComment:{$type:3}的文档,但此查询db.ratingsAndReview.find({ratingComment:{$type:3}})会返回两种类型的文档。

问题是,查询会给我所有旧格式的文件?

2 个答案:

答案 0 :(得分:1)

根据$ type

的文档
  

阵列

     

当应用于数组时,$ type匹配任何内部元素   指定的类型。没有投影,这意味着整个阵列   如果任何元素具有正确的类型,则匹配。随着投影,   结果将仅包括所请求类型的那些元素。

所以基本上它不检查数组字段的类型,它检查数组字段内的值类型,并且由于内部数组中有对象,它也返回包含数组字段的文档。

你可以试试像

这样的东西
db.ratingsAndReview.find({ratingComment:{$not:{$type:4}}})

或在$ type文档示例中

db.ratingsAndReview.find( { $where : "!Array.isArray(this.ratingComment)" } );

答案 1 :(得分:1)

尝试使用dot notation查询,以通过从零开始的索引位置指定或访问数组元素:

db.ratingsAndReview.find({ "ratingComment.0": { "$exists": false } })

这将查询集合中ratingComment字段不是数组的文档,因为它没有任何元素作为数组。