MongoDB是否匹配具有$TYPE的数组? [英] MongoDB Match an array with $type?

查看:10
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆