MongoDB是否匹配具有$TYPE的数组? [英] MongoDB Match an array with $type?
本文介绍了MongoDB是否匹配具有$TYPE的数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个包含284.116条tweet的MongoDB集合。问题是,一些对象中的"作者"字段是对象类型的,但在其他对象中--这个"作者"字段--是数组类型。所以问题是我想过滤哪些是数组,哪些是对象。
例如: 作者字段的类型为对象。
{
"_id" : ObjectId("55edfbd11a87d41d987a6dc1"),
"tweet" : "Back in my dorm, yay!",
"uri" : "https://twitter.com/natalylug0/status/640994018529181696",
"date" : "2015-09-08 00:04:17",
"country" : "U.S.A.",
"city" : "Texas",
"state" : "Dallas",
"author" : {
"username" : "Nataly",
"uri" : "https://twitter.com/natalylug0",
"screenname" : "natalylug0"
}
}
和另一个: 作者字段的类型为数组。
{
"_id" : ObjectId("55ee3a00e11fbb1030d659fe"),
"author" : [
{
"username" : "Relapsed Shini",
"uri" : "https://twitter.com/iPictoraL",
"screenname" : "iPictoraL"
}
],
"tweet" : "@zumbiezuza 😍😍😍💚 ily zoeeeeeeee",
"uri" : "https://twitter.com/iPictoraL/status/641060812140900352",
"date" : "2015-09-08 01:29:42",
"country" : "U.S.A.",
"city" : "Texas",
"state" : "Dallas"
}
所以我执行了如下查询:
db.getCollection('tweets').find({ author: { $type: 4} })
我得到的是
Fetched 0 record(s)
但如果执行$TYPE:3我会得到284.116个值,这与此集合大小的值相同。
所以我的问题是,我如何筛选"作者"字段包含数组的对象。
推荐答案
这里有一个更好的方法来完成您最初要求的操作;即实际检查某个字段是否包含数组类型值:
.find({ "author": { "$gte": [] } })
MongoDB针对数组的$type功能虽然有很好的文档记录,但与所有其他$type检查不一致,显然不适用于这个用例,但从2.6版本开始,您可以使用上面的查询来检查值是否为数组(空或不是)。
我认为这比当前选择的答案"更好",因为不建议通过$WHERE执行代码,除非标准查询构造确实无法完成工作。
更详细地说,由于无法在执行的代码中使用索引,因此出于性能考虑,不建议使用$WHERE。更多详细信息:https://docs.mongodb.com/manual/reference/operator/query/where/#considerations另外,如果您希望专门检查非空数组,请使用以下命令:
.find({ "author": { "$gt": [] } })
从技术上讲,这也比当前答案的相应$EXISTS解决方案更好,因为该字段可能有一个非数组对象,该对象的字段名为"0",这将匹配为"非空数组",在这种情况下是错误的。
这篇关于MongoDB是否匹配具有$TYPE的数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文