У нас есть несколько строк в экземпляре MongoDB, которые содержат символы, завершающиеся нулем, и нам нужно найти, какие именно. Зная, что Mongo использует регулярное выражение PCRE, мы обнаружили (Может ли регулярное выражение PCRE соответствовать нулевому символу?) правильный синтаксис для соответствия символу, завершающемуся нулем, и искал его следующим образом:
db.updates_v2.find({'longDescription': /.*\x00.*/ }).count()
Однако это возвращает 0
. Мы точно знаем, что там есть нулевые завершающие символы, потому что во время миграции в DocumentDB он отказывается их принимать. Кроме того, мы выполнили следующий запрос, подтверждающий, что виновником является longDescription
:
db.updates_v2.find().forEach(function(doc){
... for (var key in doc) {
... if ( /.*\x00.*/.test(doc[key]) )
... print(key)
... }
... });
longDescription
longDescription
longDescription
...
Я также протестировал регулярное выражение в узле (хотя и с другим механизмом регулярных выражений):
> test = "wot wot in the \0"
'wot wot in the \u0000'
> test2 = "wot wot in the wat"
'wot wot in the wat'
> regex = /.*\x00.*/
> test2.match(regex)
null
> test.match(regex)
[ 'wot wot in the \u0000',
index: 0,
input: 'wot wot in the \u0000',
groups: undefined ]
Это проблема при переходе с mongodb на aws-documentdb, так как последний не принимает символы \0 в строках.
Нам действительно нужно иметь возможность надежно вытащить их, чтобы создать сценарий, который может find
оскорблять записи, удалять пустые символы и update
записи. Любые идеи?