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



Mongo不允许文档的键中包含点(请参阅键名或 https://softwareengineering.stackexchange.com/questions/286922/inserting-json-document-with-in-key-to-mongodb 中的MongoDB点(.)。

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

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

我不知道这些记录是如何插入的。我怀疑我们一定在某个时候将check_keysmongod选项设置为假。

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

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

您可以使用$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
}
}
])

蒙戈游乐场

最新更新