Mongo不允许文档的键中带有点(请参见MongoDB dot (.) in key name或https://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}})
答案 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
}
}
])