Mongo-查找包含点的键的记录

时间:2019-02-12 17:36:38

标签: mongodb mongodb-query

Mongo不允许文档的键中带有点(请参见MongoDB dot (.) in key namehttps://softwareengineering.stackexchange.com/questions/286922/inserting-json-document-with-in-key-to-mongodb)。

但是,我们有一个巨大的mongo数据库,其中某些文档的键中确实包含点。这些文件的格式为:

{
    "_id" : NumberLong(2761632),
    "data" : {
        "field.with.dots" : { ... }
    }
}

我不知道这些记录是如何插入的。我怀疑在某个时候我们必须将check_keys mongod选项设置为false。

我的目标是找到有问题的文档,对其进行更新并删除这些点。我还没有找到如何执行搜索查询。这是我到目前为止尝试过的:

  • db.collection.find({"data.field.with.dots" : { $exists : true }})
  • db.collection.find({"data.field\uff0ewith\uff0edots" : { $exists : true}})

1 个答案:

答案 0 :(得分:1)

您可以使用$objectToArray以键和值的形式获取data。然后,可以将$filter$indexOfBytes一起使用,以检查其中是否包含带有.的键。在下一步中,您可以使用$size来过滤掉其余数组为空(没有带点的字段)的那些文档,请尝试:

db.col.aggregate([
    {
        $addFields: {
            dataKv: {
                $filter: {
                    input: { $objectToArray: "$data" },
                    cond: {
                        $ne: [ { $indexOfBytes: [ "$$this.k", "." ] } , -1 ]
                    }
                }
            }
        }
    },
    {
        $match: {
            $expr: {
                $ne: [ { $size: "$dataKv" }, 0 ]
            }
        }
    },
    {
        $project: {
            dataKv: 0
        }
    }
])

Mongo playground