Jongo MongoCollection.insert(String query) анализирует # как параметр. Как этого избежать

Я вызываю метод jongo mongoCollection.insert(String query) для вставки JSON в коллекцию. JSON содержит символ # в значении поля. Но поскольку # используется в качестве индикатора токена параметра запроса, я в конечном итоге получу ошибку синтаксического анализа с сообщением «Недостаточно параметров, переданных для запроса».

Как я могу сохранить динамическую строку JSON (обратите внимание, что я не знаю структуру или схему JSON), которая содержит символ #

Пример: { "order_id": "123445", "order_name": "test val#1" }

«test val#1» — это просто строковое значение, которое ввел пользователь. Я не хотел бы кодировать каждое значение поля, и это может быть даже невозможно в моем случае. Пожалуйста, дайте мне знать, если есть обходной путь.

Спасибо


person DPL    schedule 14.10.2014    source источник


Ответы (2)


Вы можете настроить токен, используемый Jongo, создав экземпляр пользовательского BsonQueryFactory. Тем не менее, этот токен будет использоваться для всех запросов в вашем приложении.

Если вы просто хотите изменить токен для одного запроса, вы можете передать строку с «#» в качестве параметра:

@Test
public void canFindAndInsertWithHash() throws Exception {

    collection.insert("{name:#}", "test val#1");

    Friend friend = collection.findOne("{name:#}", "test val#1").as(Friend.class);

    assertThat(friend).isNotNull();
    assertThat(friend.getName()).isEqualTo("test val#1");
}
person Benoît Guérout    schedule 15.10.2014
comment
Спасибо за ваш ответ. Но похоже, что этот обходной путь для передачи # в качестве параметра не будет работать из-за ошибки или функции в Jongo. Он заменит # на {$marshall:0}, даже если он заключен в кавычки (). В конечном итоге мы получим com.mongodb.util.JSONParseException от драйвера mongo. Чтобы быть более ясным, если я попробую collection.insert({name:test val#1}, somestring); я получу исключение - person DPL; 29.10.2014
comment
Вам не кажется, что метод BsonQueryFactory.createQuery должен учитывать # только в том случае, если он представляет полное имя свойства или значение свойства (например, {name:#}), и игнорировать #, который является частью строки значения (например, {name:test val #1}) - person DPL; 29.10.2014
comment
@DPL, вы пытаетесь вставить строковый тест valsomestring1? Если нет, то я не понимаю, почему вы пытаетесь выполнить collection.insert("{name:test val#1}", "somestring"); Если вы хотите вставить тестовое значение #1, почему у вас не работает код Бенуа? - person Paul; 31.10.2014
comment
Павел, извините, если не ясно выразился. Выше было примером. Я пытаюсь вставить тестовое значение № 1. Но, как я упоминал ранее в своем вопросе, я получаю полный JSON от клиента. Я не разбираю его, а вставляю прямо в MongoDB. Я попробовал ответ Бенуа: collection.insert({name:test val#1}, #), но это не сработает, так как в итоге мы получим JSON {name:test val{$marshall:0}1}, который отправляется к драйверу монго. Драйвер mongo не может проанализировать этот JSON и выдаст JSONParseException - person DPL; 03.11.2014
comment
Здравствуйте, я добавил тест с хешем в параметр: github.com/bguerout/jongo/blob/ Представляет ли этот тест то, чего вы пытаетесь достичь? - person Benoît Guérout; 14.11.2014
comment
Нет, все, что я пытаюсь сделать, это collection.insert({name:test val#1}); Попытка вставить простой JSON, в котором есть символ #. - person DPL; 09.12.2014

У меня был такой же pb, и я решил его, продублировав org.jongo.marshall.mapper.JacksonMapper, но изменив строку 60 на:

queryFactory = new BsonQueryFactory(jacksonEngine, "#|#");

где #|# мой новый шаблон...

Затем я делаю:

Mapper jm = new JacksonMapperCustom.Builder().build();
Jongo jongo = new Jongo(db, jm);

И это работает хорошо!

person jb cazaux    schedule 24.01.2015