我有一个MongoDbCollection ,包含284.116条推文.问题在于,某些对象中的"author"字段是对象类型,但其他对象中的"author"字段是数组类型.所以问题是我想过滤哪些是数组,哪些是对象.

例如:

{
    "_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个值,这和这个集合的大小相同.

所以我的问题是,如何过滤"author"字段包含数组的对象.

推荐答案

这里有一个更好的方法来完成你最初的要求;也就是说,实际判断某个字段是否包含数组类型值:

.find({ "author": { "$gte": [] } })

MongoDB的数组$type功能虽然有很好的文档记录,但与所有其他$type判断不一致,显然不适用于此用例,但由于大约在2.6版本,您可以使用上面的查询来判断值是否为数组(空或非空).

我说这比当前 Select 的答案"更好",因为不建议通过$where执行代码,除非标准查询构造确实无法完成任务.

为了详细说明,由于在执行的代码中缺乏使用索引的能力,因此不建议使用$where.更多细节:https://docs.mongodb.com/manual/reference/operator/query/where/#considerations

此外,如果您想特别判断非空数组,请使用以下命令:

.find({ "author": { "$gt": [] } })

从技术上讲,这一个也比当前答案对应的$exists解决方案好,因为该字段可能有一个名为"0"的非数组对象,这将匹配为"非空数组",在这种情况下是错误的.

Mongodb相关问答推荐

在MongoDB中,如何使用$in来匹配存储在数组变量中的值

MongoDB$unionWith,如何 Select 特定文档

除非满足某个条件,否则Mongo是否按日期排序?

聚合管道可以用于更新数据库中的文档吗?

MongoDB 按 created_at 月聚合

Golang 无法在 MongoDB 中创建文档

Mongodb按值分组并计算出现次数

如何根据_id删除文档?

无法提取地理键,经度/纬度超出范围

Mocking/stubbing mongoose模型保存方法

mongodump 是否锁定数据库?

具有多个字段的mongodb文本搜索

Mongoose 不创建新集合

Mongo:匹配聚合查询中的日期似乎被忽略了

如何判断 MongoDB 中是否存在字段?

Mongodb Atlas:管理员未授权执行命令

判断字段是否存在于数组的子文档中

MongoDB聚合框架的索引优化

Meteor 发布/订阅独特客户端集合的策略

用于 MongoDB 的 Node.js 模块