MongoDB 키에`.`가 포함 된 JSON 문서 삽입 발견했습니다 . MongoDB 설명서에서 마침표 .는 쿼리에

첫째, 이것은 프로그래밍 질문보다 디자인 질문에 가깝습니다.

기존 JSON 데이터를 가져 와서 MongoDB에 삽입 해야하는 응용 프로그램을 만들고 있습니다. 일부 JSON 문서에는 .키에 마침표가 있음을 발견했습니다 . MongoDB 설명서에서 마침표 .는 쿼리에 사용되므로 MongoDB에서 키로 허용되지 않는다는 것을 읽었습니다 .

웹 응용 프로그램에서 많은 삽입 작업을 수행하지는 않지만 한 번만 삽입하면됩니다. 또한 모든 데이터를 가져와야하기 때문에 대부분 문서 전체를 검색하지 않고 전체 문서를 검색합니다.

따라서 요구 사항을 고려할 때 JSON 문서를 저장하는 방법에 대한 두 가지 선택이 있습니다.

  1. 키에서 기간을 JSON을 통해 검색하고 이스케이프 한 후 MongoDB에 삽입하십시오.
  2. 전체 JSON을 BSON 형식 으로 변환 하고 그대로 저장하여 이스케이프 처리를 피하고 MongoDB 외부에서 필요할 때 JSON을 수동으로 구문 분석하십시오.

결론을 내릴 수 없으므로 더 나은 디자인이 무엇인지 말해 줄 수 있습니까?



답변

몇 가지 대안이 있습니다.

1. 점을 대시로 바꿉니다.

이것은 구조를 충분히 명시 적으로 유지하기 때문에 내가 가장 좋아하는 접근법입니다.

당신에 따르면,“그것은 거의 한 번만 삽입하는 것”이므로, 아무것도 깨지지 않는지 확인하는 것이 비교적 간단해야합니다 (즉, 이미 대시가있는 동일한 키가 있음). 다른 상황에서는 프로그래밍 방식으로 검사를 수행하려면 일부 코드를 작성해야하지만 여전히 비교적 쉬운 작업입니다.

2. 점을 U + FF0E와 같은 유니 코드 점 문자로 바꿉니다 .

이 방법을 사용하는 것은 강력히 권고 할 것 입니다 . 을 따라 엄청난 디버깅 문제가 발생할 수 있기 때문입니다 . MongoDB에서 멀리 떨어진 코드에서 어딘가에 결과 JSON을 사용하는 사람이 실제로 점이 아니라고 추측하면 문자 그대로 몇 주 동안 시간을 ​​낭비하는 좋은 방법입니다. 캐릭터가 다른 캐릭터라고 생각하도록 누군가를 속이려고하는 해커에게 이러한 유니 코드 트릭을 유지하십시오.

3. BSON을 사용하십시오.

당신은 당신이 주장 때문에 “대부분 오히려 일부를 쿼리보다 전체 문서를 검색하는 것”이 방법은 큰 단점이없는 귀하의 경우를 . “대부분”이라고 말했지만 때로는 문서의 일부만 검색한다는 의미입니다.

일반적으로 단점은 문서를 검색하거나 문서의 일부만로드 할 수 없다는 것입니다.

4. Base64와 같은 표준 인코딩을 사용하십시오.

문제가있는 키 (또는 문제가되는 키와 문제가 아닌 키 사이의 비율에 따라 모든 키)를 Base64 또는 16 진수로 변환하는 것은 실질적인 이점이있는 실질적인 해결책 일 수 있습니다. 대부분의 개발자는 Base64 또는 16 진수 값을 한 눈에 인식합니다. .

단점은 메모리 사용 공간이 증가하고 키를 사용할 때 키를 인코딩 및 디코딩해야한다는 점입니다.

5. 설정 check_keysfalse.

데이터 쿼리를 모호하게 만들고 특정 쿼리가 수행해야한다고 생각한 작업을 수행하지 못하는 이유를 파악하는 데 몇 시간 또는 며칠 이 걸리기 때문에이 방법에 대해 강력히 권고 합니다. 도트는 예약 된 캐릭터이며 수표는 귀하를 보호하기 위해 여기에 있습니다. MongoDB에 확인을 건너 뛰도록 지시하면 MongoDB 구문과 키에 사용 된 예약 문자 간의 충돌을 처리해야하는 순간 만 연기하게됩니다.


답변

BSON을 사용하십시오. 그런 다음 잘 테스트 된 라이브러리 지원과 함께 잘 문서화 된 형식이 있으며, 가장 중요한 것은 손실없이 인코딩 (디코딩 / 디코딩) 할 수 있다는 것입니다.