본문 바로가기

mongoDB

[mongoDB] 필드값이 null 또는 not set인 도큐먼트 find문으로 찾기 (feat. $ne: null)

반응형

mongoDB 에서 Find 쿼리문으로 데이터를 찾을 때 마다 헷갈려서 써보는 공부겸 정리 글

 

먼저 counter라는 collection에 아래 데이터들을 먼저 넣어 주었다.

db.counter.insertOne({name: 'gugucon'})
db.counter.insertOne({name: 'melona', price: 500})
db.counter.insertOne({name: 'byulanba', price: 10000, color: 'brown'})
db.counter.insertOne({name: 'bbabbico', pirce: 1000000, color: null})
db.counter.insertOne({name: 'choco', price: null, color: null})
db.counter.insertOne({name: null})
db.counter.insertOne({quantity : 10})

 

이제 위의 데이터로 실험해보기 !! 

 

 

1. $exists: true 

해당 필드를 가지고 있는 도큐먼트들과, 해당 필드를 가지고 있지만 null값인 도큐먼트들까지 모두 찾는다. 

* 필드 존재하는 도큐먼트 

* 필드 값 Null이라도 존재하면 찾음 

=> Null 도 value이다. 그냥 "존재"여부로 생각하기!!

 

위에 넣어진 데이터 중에 color 필드가 exists: true한 데이터를 찾아보면

db.counter.find({color: {$exists: true}})

3,4,5 번째 데이터가 나온다. 

 

db.counter.find({color: {$exists: false}})

 

exists: false 인 경우는 2,

color 필드명이 없는 1, 2, 6, 7번째 데이터가 나온다. 

 

 

 

2. null

필드가 있는데 값이 Null 이거나 아예 필드가 존재하지 않는 경우 

* 해당 필드 value = null 

* 해당 필드가 존재하지 않음

 

db.counter.find({color: null})

color에 'brown' 값이 있는 별난바를 제외하고 모두 찾는다. 

 

 

 

 

 

3. 값이 null 인 것만 찾기

* 필드의 값이 Null인 도큐먼트만 찾는다. 

 

db.counter.find({color: {$type: 10}})

 

여기서 $type 은 각 BSON types들의 고유 번호를 말한다. 

 

참고 : https://www.mongodb.com/docs/manual/reference/bson-types/

 

 

 

 

정리해보면, 

필드의 "존재" 여부 -> $exists: true (or false) 

필드 값이 Null 또는 필드 존재X -> { fieldName: null }

필드 값이 null인 것만 -> { fieldName: {$type: 10}} 

 

 

 

 

 

4. $ne: value 는? 

$ne (Not equal) 은 특정 value와 같지 않은 도큐먼트들을 찾는다.  해당 필드를 갖지 않은 도큐먼트들도 포함한다. 

 

 

example 1.

db.counter.find({color: {$ne: 'brown'}})

color 필드의 값이 'brown' 이 아닌 모든 도큐먼트들을 가져왔다. "color"라는 필드가 존재하지 않는 도큐먼트도 어쨌든(?) 값이 'brown'이 아니므로 포함이다. 

 

 

 🔍  그론데 여기서 $ne: null 을 해보았더니❓

db.counter.find({color: {$ne:null}})

 

4,5 번째 데이터는 color: null 값이어서 안나오는 것은 이해가 되었으나 

color 필드가 존재하지 않는 1, 2, 6, 7 번째 데이터 또한 나오지 않았다. 

위에서 value 가 'brown' 아닌 것을 $ne으로 찾을 때 color 필드가 존재하지 않는 데이터들이 모조리 나왔었다. 

왜 ! 여기서 value 를 null로 찾을 때는 해당되지 않는 것인가 

 

-> $ne: null 은 해당 필드가 존재하지 않는 것도 null 이라고 봐서 그런 것 같다. 

위에서 { color: null } 에 대한 결과가 해당 color 필드가 없는 것까지 모두 나왔었는데 이거에 대한 반대인 것 같다. 

 

 

 

쟝난 아니군

 

 

 

 

 

 

반응형