我的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}})
会返回两种类型的文档。
问题是,查询会给我所有旧格式的文件?
答案 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
字段不是数组的文档,因为它没有任何元素作为数组。