MongoDB 쿼리 옵션 모음



1. 프로젝션

프로젝션은 결과 값 도큐먼트에 대해 리턴할 필드를 지정하는 데 사용한다.


특별히 도큐먼트의 수가 많을 때 프로젝션을 사용하면 네트워크 지연(latency)과 디시리얼라이제이션에 들어가는

비용을 줄일 수 있다.


프로젝션은 다음과 같이 리턴할 필드로 보통 정의된다.


1) 리턴받고 싶은 필드를 정의하거나, 제외할 필드를 정의 할 수 있다.


db.users.find({}, {username:1})

==> 위 쿼리는 users 도큐먼트에서 username 필드와 _id 필드만을 리턴한다. _id는 디폴트로 항상 리턴한다.


포함시키지 않고싶은 필드는 0을 주면된다.

db.users.find({}, { address : 0, pay : 0})  // address와 pay 필드는 제외된 값이 리턴된다.



2) $slice - 리턴될 배열의 값을 어떤 범위 내에서 정할 수있다.

  예를 들어 리뷰를 여러 페이지로 나눠서 보여주길 원한다면 $slice 연산자로 제한할 수 있다.


도큐먼트 : { a:1, b:2, review:[{rating:3, ...},{},{},{},{},{},{},{},{},{}...] }


db.products.find({}, { review : { $slice: 12} }) // 결과값중 처음 12개만 가져온다.

db.products.find({}, { review : { $slice: -5} }) // 결과값중 마지막 5개만 가져온다.



$slice 는 2개의 숫자로 된 배열로도 가능하다. 각각. 스킵(skip), 리미트(limit) 를 나타낸다.


처음 24개의 리뷰를 제외하고 난 후 가져올 리뷰를 12개로 제한하는 쿼리

db.products.find({},{ review : { $slice : [24, 12]} })



3)   1) 과 2)를 조합하여 사용하는 예


바로위 쿼리에 review의 rating 필드만 가져오고 싶을때 


db.products.find({}, { review : { $slice : [24, 12], 'review.rating' : 1} } )








1. 정렬

정렬은 오름차순, 내림차순으로 정렬할 수 있다.


내림차순 

==> db.products.find({}).sort({ rating : -1 })


오름차순 

==> db.products.find({}).sort({ rating : 1 })


2개이상의 조건 

==> db.products.find({}).sort({ helpful: -1, rating: -1 })



추가중



YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



MongoDB 쿼리 연산자 모음




1. <, <=, >, >= 연산자

Mongo DB에서 <, <=, >, >= 를 사용할 때,


<  는  "$lt"

<=  는  "$lte"


>  는  "$gt"

>=  는  "$gte"


로 표현할 수 있다.


예제


SELECT * FROM users WHERE age >= 20;

==> db.users.find({ age : { "$gte" : 20 } });


SELECT * FROM users WHERE age < 20;

==> db.users.find({ age : { "$lt" : 20 } });


 AND 연산

SELECT * FROM users WHERE age BETWEEN 20 AND 25;

==> db.users.find({ age : { "$gte" : 20 , "$lte" : 25} });



age:{"gte":20}, age:{"$lte":25} 로 질의하면 같은 도큐먼트 내의 같은 수준에서는 반복으로 

질의 할 수 없습니다. 따라서 틀렸습니다.





2. $in, $nin, $all 연산자

SELECT * FROM users WHERE age IN(3,5,7,9);

==> db.users.find({ age : { $in : [3, 5, 7, 9] });


SELECT * FROM users WHERE age NOT IN(3,5,7,9);

==> db.users.find({ age : { $nin : [3, 5, 7, 9] }); // 문자열["ab", "안녕", "margo"]




모든 조건이 검색키와 일치되는 도큐먼트 찾기


도큐먼트 

{ name: "Bird Feeder",

   tags: [ "gift", "birds", "garden" ]

}

==> db.products.find({ tags : { $all : ["gift", "garden"] }  });






3. $ne, $not, $or, $and, $exists
 연산자

$ne - 같지않음(not equal to)  ** 단일한 값이거나, 배열인 경우 모두 수행된다

name 이 "ace" 인 도큐먼트중 tags가 "test" 가 아닌 모든 도큐먼트

==> db.products.find({ 'name':'ace', tags: {$ne : "test"} })



$not - 다른 연산자나 정규 표현식으로 부터 얻은 결과의 여집합을 리턴

성이 B로 시작하지 않는 모든 유저의 도큐먼트

==> db.users.find({ last_name: { $not: /^B/ } })



$or - 서로 다른 키에 대한 검색을 할 때 사용한다. 만약 같은 키에 대해 찾는다면  $in을 써야한다.

color 가 blue 이거나, name 이 ace인 도큐먼트를 검색할 때

==> db.products.find({ $or : [

{ 'details.color': 'blue'}

, { 'details.name': 'ace'}

})



$and 

- {age:3, name:'margo'} 는 age :3 AND name:'margo' 로 해석된다.

  이런 방법으로 AND 를 표현할 수 없을때 $and를 사용한다.

예제 도큐먼트

{ tags: ['gift', 'holiday', 'gardening', 'landscaping'] }


gift 나 holiday중 하나가 포함되고, gardening 나 landscaping 중 하나가 포함된 도큐먼트를

찾고싶을때, 이 쿼리를 표현하는 유일한 방법은 2개의 $in 쿼리를 $and 로 연결하는 것이다.


db.products.find({ $and : [

{tags : { $in : ['gift', 'holiday']}}

, {tags : { $in : ['gardening', 'landscaping']}}

]

}) 




$exists - 특정 키, 즉 도큐먼트가 해당 속성을 가지고 있는지 질의하는 쿼리다.

도큐먼트내에 특성 속성이 존재할수도 있고, 존재하지 않을수도 있다.

상품에 대한 컬렉션의 경우, 어떤 상품만의 특별한 키를 가질수 있을텐데, 

그때 해당도큐먼트가 그 키를 가지고 있는지 확인하고싶을때 사용한다.


속성을 가지고 있지 않은 도큐먼트를 찾을때 - false

==> db.products.find({ 'datails.color' : { $exists : false}})


속성을 가진 도큐먼트 - true

==> db.products.find({ 'datails.color' : { $exists : true}})


$exists : false 는 아래와 같이 표현가능하다.

==> db.products.find({ 'details.color' : null })


$exists : true 는 아래와 같이 표현가능하다.

==> db.products.find({ 'details.color' : {$ne: null }  })



YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST