source

MongoDB에 null을 저장하는 중과 키를 전혀 저장하지 않는 중

lovecheck 2023. 5. 12. 22:22
반응형

MongoDB에 null을 저장하는 중과 키를 전혀 저장하지 않는 중

Mongo 문서를 작성할 때 필드가 있는 것 같습니다.{key: value}때로는 값이 없을 수도 있습니다. 두 가지 옵션이 있습니다.

  1. {key: null}을 기록합니다. " "는 null 값을 기록합니다.
  2. 해당 문서에 키를 전혀 저장하지 않음

모두 쿼리할 수 , 한에서는 " 두가옵모쉽쿼수있다니습할리게두션지▁for다▁both"를 쿼리합니다.{key : null}그리고 당신이 문의하는 다른 사람.{key : {$exists : false}}.

애플리케이션 시나리오에서 영향을 미칠 수 있는 두 옵션 간의 차이점은 전혀 생각할 수 없습니다(옵션 2의 스토리지 용량이 약간 적다는 점 제외).

두 가지 접근 방식 중 하나를 다른 접근 방식보다 선호하는 이유가 있다면, 그리고 그 이유를 말해줄 수 있는 사람이 있습니까?

편집

질문을 한 후 인덱스가 두 가지 경우에 다르게 작동할 수 있다는 것도 알게 되었습니다. 즉, 옵션 2에 대해 희소 인덱스를 만들 수 있습니다.

은 세 가능성도 있습니다: 실로당또한세번가참능조오시십하을성째제신은▁indeed오.key: "" 값으)로 표시)

그리고 null 값에 대한 특수성을 잊어버립니다.에 대한 key: null키가 null이거나 키가 존재하지 않는 모든 문서를 검색합니다.

에 대한 때.$exists:false필드 키가 없는 문서만 검색합니다.

정확한 질문으로 돌아가려면 쿼리와 데이터가 무엇을 나타내는지에 따라 달라집니다.예를 들어 사용자가 값을 설정한 후 설정을 해제한 상태로 유지해야 하는 경우 필드를 null 또는 빈 상태로 유지해야 합니다.필요 없는 경우 이 필드를 제거할 수 있습니다.

이름 하지 않기 때문에 MongoDB는 필드 이름 사전 압축을 사용합니다.field:null에서는 디스크 공간과 RAM을 사용하지만 키를 전혀 저장하지 않으면 리소스가 사용되지 않습니다.

결론은 다음과 같습니다.

  • 시나리오
  • 당신의 질문하는 태도
  • 인덱스에 필요한 항목
  • 사용자의 언어

개인적으로 Null 키를 저장하도록 선택했습니다.그것은 내 앱에 통합하는 것을 훨씬 더 쉽게 만듭니다.저는 액티브 레코드와 함께 PHP를 사용하고 null 값을 사용하면 앱에 현장 의존성의 스트레스를 줄 필요가 없기 때문에 제 삶이 훨씬 쉬워집니다.또한 존재하지 않는 변수를 설정하기 위해 마법을 다룰 복잡한 코드를 만들 필요가 없습니다.

저는 으로 저는개으다같음빈은않다습니저값장지와 같은 빈 입니다."" 두 빈 값이 수 입니다.null그리고.""그리고 나서 당신은 구체적으로 질문하는 행복한 시간을 갖게 될 것입니다.그래서 저는 개인적으로.null값이 비어 있는 경우.

공간 및 인덱스의 경우: 이 열을 포함하지 않을 수 있는 행 수에 따라 다르지만 null이 포함된 몇 개의 추가 문서로 인해 인덱스 크기가 증가할 것이라고는 생각하지 않습니다.특히 해당 키 이름이 작은 경우에는 저장소 차이가 미미합니다.이는 대규모 설정에도 적용됩니다.

솔직히 다음 사이의 인덱스 사용에 대해 잘 모르겠습니다.$exists그리고.null하지만nullMongoDB가 스키마가 없다는 것을 기억하기 때문에 존재를 쿼리하는 더 표준화된 방법일 수 있습니다. 즉, 문서에 해당 필드를 가질 필요가 없습니다. 이 필드는 다시 두 개의 빈 값을 생성합니다.null둘 중 하나를 선택하는 것이 더 낫습니다.

나는 선택null.

또한 Hibernate OGM과 같은 OGM 도구를 사용하는 경우도 고려해야 합니다.

Java를 사용하는 경우 Hibernate OGM은 JPA 표준을 지원합니다.따라서 JPQL 쿼리를 작성할 수 있다면 OGM 툴이 지원하는 대체 NoSQL 데이터스토어로 전환하는 것이 이론적으로 쉬울 것입니다.

JPA는 Mongo에 존재하는 $에 대해 동등한 값을 정의하지 않습니다.따라서 컬렉션에 선택적 속성이 있는 경우 동일한 속성에 대해 적절한 JPQL을 작성할 수 없습니다.이러한 경우 속성의 값이 NULL로 저장되어도 아래와 같이 유효한 JPQL 쿼리를 작성할 수 있습니다.

SELECT p FROM pppoe p where p.logout IS null;

디스크 공간 측면에서 그 차이는 무시해도 될 정도라고 생각합니다.이 필드에 색인을 작성해야 하는 경우 부분 색인을 고려합니다.

색인으로{ partialFilterExpression: { key: { $exists: true } } }정규 인덱스보다 훨씬 작을 수 있습니다.

또한 쿼리는 다르게 표시되므로 다음과 같은 값을 참조하십시오.

db.collection.insertMany([
  { _id: 1, a: 1 }, 
  { _id: 2, a: '' }, 
  { _id: 3, a: undefined }, 
  { _id: 4, a: null }, 
  { _id: 5 }
])
db.collection.aggregate([
   {
      $set: {
         type: { $type: "$a" },
         ifNull: { $ifNull: ["$a", true] },
         defined: { $ne: ["$a", undefined] },
         existing: { $ne: [{ $type: "$a" }, "missing"] }
      }
   }   
])
   
{ _id: 1, a: 1,         type: double,    ifNull: 1,    defined: true,  existing: true }
{ _id: 2, a: "",        type: string,    ifNull: "",   defined: true,  existing: true }
{ _id: 3, a: undefined, type: undefined, ifNull: true, defined: false, existing: true }
{ _id: 4, a: null,      type: null,      ifNull: true, defined: true,  existing: true }
{ _id: 5,               type: missing,   ifNull: true, defined: false, existing: false }

또는 함께db.collection.find():

db.collection.find({ a: { $exists: false } })
  { _id: 5 }

db.collection.find({ a: { $exists: true} })
  { _id: 1, a: 1 }, 
  { _id: 2, a: '' }, 
  { _id: 3, a: undefined }, 
  { _id: 4, a: null }

db.collection.find({ a: null })
  { _id: 3, a: undefined }, 
  { _id: 4, a: null },
  { _id: 5 }

db.collection.find({ a: {$ne: null} })
  { _id: 1, a: 1 }, 
  { _id: 2, a: '' }, 

db.collection.find({ a: {$type: "null"} })
  { _id: 4, a: null }

언급URL : https://stackoverflow.com/questions/12403240/storing-null-vs-not-storing-the-key-at-all-in-mongodb

반응형