【问题标题】:Mongo - finding records with keys containing dotsMongo - 查找包含点的键的记录
【发布时间】:2019-02-12 17:36:38
【问题描述】:

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}})

【问题讨论】:

  • 所以最后你想得到这样的东西:{ "_id" : NumberLong(2761632), "data" : { "fieldwithdots" : { ... } } } ?
  • 我只想找到{ "_id" : NumberLong(xxx), "data" : { "field.with.dots" : { ... } } } 形式的所有记录。一旦找到,我可以更新它们以删除这些点或用其他东西替换它们。

标签: mongodb mongodb-query


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-19
    • 2017-03-09
    • 2013-03-19
    • 1970-01-01
    • 2011-08-28
    • 2014-08-16
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多