4 분 소요

✔️ MongoDB

MongoDB는 NoSQL이라 고정된 스키마나 JOIN이 존재하지 않고 동적 스키마형 문서를 사용합니다. 몽고디비에서는 그러한 동적 스키마형 문서를 Binary JSON(JavaScript Object Notaion) 라고 부릅니다. JSON 형태기 때문에 직관적이라 개발이 편리하고, 읽기 및 쓰기 성능이 뛰어나서 속도가 매우 빠릅니다.

✔️ RDB와 MongoDB 용어 비교

RDB와 MongoDB 용어를 비교하는 경우 아래와 같습니다.

RDB MongoDB
Table Collection
Row Document
Column Field
Primary Key Object_Id Field
Relationship Embedded & Link

✔️ 연산자 정리

👉 비교연산자

operator 설명
$eq 같음 (==)
$gt 초과 (>)
$gte 이상 (>=)
$lt 미만 (<)
$lte 이하 (<=)
$ne 같지 않음 (!=)
$in 전달한 배열 요소중 하나
$nin 전달한 배열 요소중에 없거나 필드가 존재하지 않을 때 조회

👉 논리연산자

operator 설명
$or 주어진 조건 중 하나라도 true인 경우 true 반환
$and 모든 조건이 true 이면 true 반환
$not 해당 조건이 false 이면 true 반환
$nor 모든 조건이 false 이면 true 반환

✔️ 쿼리 정리

MongoDB 데이터베이스 및 컬렉션 문법에 대한 내용은 관련 포스팅 을 참고해주세요 :)

👉 documents 조회(find)

1
> db.<collection 이름>.find()
입력 key&value 값을 가진 docs만 리턴
1
> db.<collection 이름>.find({ "books" : "Gravity" })
views의 값이 30이하인 docs만 리턴
1
> db.<collection 이름>.find({ "views" : {$lte:30} })
쿼리 결과에 보여줄 field지정
1
> db.<collection 이름>.find({},{ "\_id" : false, "title" : true })
comments의 name이라는 field의 value가 Charles인 docs만 출력
  • $elemMatch : embedded doct 배열 쿼리시 사용
1
> db.<collection 이름>.find({ "comments" : {$elemMatch : { "name" : "Charles" }}})
보기좋게 정렬: pretty()
1
> db.cities.find({ "name" : "Minneapolis" }).pretty()
오름차순 & 내림차순 정렬: sort()
  • name field를 내림차순으로 정렬하여 출력
1
> db.<collection 이름>.find({},{ "name" : true }).sort({ "name" : -1 })
  • _id field를 내림차순으로 정리하고, name field를 오름차순으로 정렬하여 출력
1
> db.<collection 이름>.find({},{ "name" : true }).sort({ "\_id" : -1 , "name" : 1 }}
5개 docs만 출력
1
> db.<collection 이름>.find().limit(5)
2개를 건너뛰고 그 다음 docs를 출력
1
> db.<collection 이름>.find().skip(2)

👉 데이터 업데이트

INSERT 하기
1
2
3
4
5
6
> db.people.insert( [
    { name: "Abet", age: 19 },
    { name: "Betty", age: 20 },
    { name: "Charlie", age: 23, skills: [ "mongodb", "nodejs"] },
    { name: "David", age: 23, score: 20 }
])
특정 field 업데이트 하기: $set
1
2
> db.people.update( { name: "Abet" }, { $set: { age: 20 } } )
> WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
특정 field 제거하기: $unset
1
2
> db.people.update( { name: "David" }, { $unset: { score: 1 } } )
> WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
field가 있으면 수정, 없으면 새로 추가하기 : upsert:true
1
2
3
4
5
6
7
> db.people.update( { name: "Elly" }, { name: "Elly", age: 17 }, { upsert: true } )
WriteResult({
  "nMatched" : 0,
  "nUpserted" : 1,
  "nModified" : 0,
  "_id" : ObjectId("56c893ffc694e4e7c8594240")
})
특정 조건에 맞는 field 한꺼번에 수정하기: multi:true
1
2
3
4
5
6
> db.people.update(
  { age: { $lte: 20 } },
  { $set: { score: 10 } },
  { multi: true }
  )
> WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 0 })
skills 배열에 새로운 값 추가하기: $push
1
2
3
4
5
> db.people.update(
  { name: "Charlie" },
  { $push: { skills: "angularjs" } }
  )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
skills 배열에 여러 값 추가하고 오름차순으로 정렬하기: $each, $sort
1
2
3
4
5
6
7
8
9
10
11
> db.people.update(
  { name: "Charlie" },
  { $push: {
      skills: {
          $each: [ "c++", "java" ],
          $sort: 1
      }
    }
  }
  )
> WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
skills 배열에 하나의 요소 제거: $pull
1
2
3
4
> db.people.update(
  { name: "Charlie" },
  { $pull: { skills: "mongodb" } }
 )

👉 커스텀 인덱스 추가

이미 존재하는 collection 에 추가할 경우
1
2
3
4
> db.products.createIndex(
  { item: 1, quantity: -1 } ,
  { name: "query for inventory" }
)
인덱스 종류 쿼리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
> db.cities.getIndexes()
[
  {
    "v" : 2,
    "key" : {
      "_id" : 1
    },
    "name" : "_id_",
    "ns" : "test.cities"
  },
  {
    "v" : 2,
    "key" : {
      "_id" : 1,
      "checkins" : -1
    },
    "name" : "_id_1_checkins_-1",
    "background" : true,
    "ns" : "test.cities"
  },
  {
    "v" : 2,
    "key" : {
      "geolocation" : "2dsphere",
      "_id" : 1,
      "checkins" : -1
    },
    "name" : "geolocation_2dsphere__id_1_checkins_-1",
    "ns" : "test.cities",
    "background" : true,
    "2dsphereIndexVersion" : 3
  }...
new schema, field 레벨 에서 추가
1
2
3
4
5
 var animalSchema = new Schema({
 	name: String,
    type: String,
    tags: { type: [String], index: true } // animal의 tag를 인덱스로 지정
  });
new schema, compound index는 항상 schema 레벨에서 추가하기
1
 animalSchema.index({ name: 1, type: -1 }); // schema level

✔️ 참고 사이트

https://velopert.com/479 https://www.mongodb.com/docs/manual/reference/operator/query/
https://velog.io/@rosewwross/MongoDB-%EC%B4%88%EA%B8%B0%EC%84%A4%EC%A0%95-%EB%B0%8F-%EC%BF%BC%EB%A6%AC%EB%AC%B8-%EC%A0%95%EB%A6%AC

🔔포스팅 공지
개인 공부 기록용 블로그 입니다.
잘못된 부분이 있을 시 메일이나 댓글로 지적해주시면 감사드리겠습니다 :)

댓글남기기