MongoDB - Query Document
조회 (find()) //db.COLLECTION_NAME.find(query, projection)
Document 를 조회하는 find() 메소드
find() 메소드의 인자로 query 와 projection 이 들어옵니다.
두 값 모드 Optional 파라메터입니다.
query 의 데이터 타입은 document(객체) 입니다. 이는 다큐먼트를 조회하는 기준을 정하는 파라메터입니다. 이 값이 생략되거나 비어있는 객체 {} 를 전달하면 해당 컬렉션의 모든 다큐먼트들을 조회합니다.
projection 의 데이터 타입 역시 document 로, 조회한 다큐먼트의 표시할 field 를 지정하는 것 입니다.
실습 위해 컬렉션 만들어보고 삽입!
>db.articles.insert([
{
"title": "article01",
"content": "content01",
"writer": "Velopert",
"likes": 0,
"comments": []
},
{
"title": "article02",
"content": "content02",
"writer": "Alpha",
"likes": 23,
"comments": [
{
"name": "Bravo",
"message": "Hey Man!"
}
]
},
{
"title": "article03",
"content": "content03",
"writer": "Bravo",
"likes": 40,
"comments": [
{
"name": "Charlie",
"message": "Hey Man!"
},
{
"name": "Delta",
"message": "Hey Man!"
}
]
}
])
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 3,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
> db.articles.find().pretty()
{
"_id" : ObjectId("5d80289f790e7a86104506af"),
"title" : "article01",
"content" : "content01",
"writer" : "Velopert",
"likes" : 0,
"comments" : [ ]
}
{
"_id" : ObjectId("5d80289f790e7a86104506b0"),
"title" : "article02",
"content" : "content02",
"writer" : "Alpha",
"likes" : 23,
"comments" : [
{
"name" : "Bravo",
"message" : "Hey Man!"
}
]
}
{
"_id" : ObjectId("5d80289f790e7a86104506b1"),
"title" : "article03",
"content" : "content03",
"writer" : "Bravo",
"likes" : 40,
"comments" : [
{
"name" : "Charlie",
"message" : "Hey Man!"
},
{
"name" : "Delta",
"message" : "Hey Man!"
}
]
}
- articles 의 다큐먼트 중 writer 가 Bravo 인 다큐먼트를 검색
특정 field 의 정확한 값으로 다큐먼트를 조회할 때는 find 의 query 로 찾을 document 를 객체 형식으로 지정
> db.articles.find({ "writer" : "Bravo" }).pretty()
{
"_id" : ObjectId("5d80289f790e7a86104506b1"),
"title" : "article03",
"content" : "content03",
"writer" : "Bravo",
"likes" : 40,
"comments" : [
{
"name" : "Charlie",
"message" : "Hey Man!"
},
{
"name" : "Delta",
"message" : "Hey Man!"
}
]
}
Query 연산자
- 비교 연산자
operator |
설명 |
$eq |
(equals) 주어진 값과 일치하는 값 |
$gt |
(greater than) 주어진 값보다 큰 값 |
$gte |
(greater than or equals) 주어진 값보다 크거나 같은 값 |
$lt |
(less than) 주어진 값보다 작은 값 |
$lte |
(less then or equals) 주어진 값보다 작거나 같은 값 |
$ne |
(not equlas) 주어진 값과 일치하지 않는 값 |
$in |
(in) 주어진 배열 안에 속하는 값 |
$nin |
(not in) 주어진 배열 안에 속하지 않는 값 |
articles 콜렉션 안의 다큐먼트 중 like 필드의 값이 10보다 크고 30보다 작은 다큐먼트를 조회
> db.articles.find( { "likes" : { $gt : 10, $lt : 30 } } ).pretty()
{
"_id" : ObjectId("5d80289f790e7a86104506b0"),
"title" : "article02",
"content" : "content02",
"writer" : "Alpha",
"likes" : 23,
"comments" : [
{
"name" : "Bravo",
"message" : "Hey Man!"
}
]
}
- 논리(Logical) 연산자
Operator |
설명 |
$or |
주어진 조건 중 하나라도 만족한다면 true |
$and |
주어진 조건을 모두 만족해야만 true |
$not |
주어진 조건이 거짓일 때 true |
$nor |
주어진 모든 조건이 거짓일 때 true |
-title 의 값이 "article01" 이거나 writer 의 값이 "Alpha" 인 도큐먼트를 조회
> db.articles.find( { $or : [ { title : "article01" }, { writer : "Alpha" } ] } ).pretty()
{
"_id" : ObjectId("5d80289f790e7a86104506af"),
"title" : "article01",
"content" : "content01",
"writer" : "Velopert",
"likes" : 0,
"comments" : [ ]
}
{
"_id" : ObjectId("5d80289f790e7a86104506b0"),
"title" : "article02",
"content" : "content02",
"writer" : "Alpha",
"likes" : 23,
"comments" : [
{
"name" : "Bravo",
"message" : "Hey Man!"
}
]
}
-writer 의 값이 "Alpha" 이고, like 의 값이 20 이상인 다큐먼트를 조회
> db.articles.find( { $and : [ { writer : "Alpha" }, { likes : { $gt : 20 } } ] } ).pretty()
{
"_id" : ObjectId("5d80289f790e7a86104506b0"),
"title" : "article02",
"content" : "content02",
"writer" : "Alpha",
"likes" : 23,
"comments" : [
{
"name" : "Bravo",
"message" : "Hey Man!"
}
]
}
>
-$and 연산자는 하나의 query 객체로 표현하는 것과 같음.
db.articles.find( { $and : [ { writer : "Alpha" }, { likes : { $gt : 20 } } ] } ).pretty()
=
db.articles.find( { writer : "Alpha", likes : { $gt : 20 } } ).pretty()
Update() //db.콜렉션명.update(SELECTION_CRITERIA, UPDATED_DATA)
>db.mycol.update({'title' : 'MONGO DB'}, {$set :{'title' : 'new mongo'}})
>db.mycol.update({'title' : 'MONGO DB'}, {$set :{'title' : 'new mongo'}}, {multi : true})
Save() //db.콜렉션명.save({_id : 객체id(), new_data})
save()는 동일 id값이 들어오면 update. 그리고 save() 함수 변경시 변경/추가 여부를 결과값으로 알려줌
> db.user.save({ "_id" : 5, "name" : "matt", "part" : "staf", "title" : "lab" })
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 5 })
> db.user.save({ "_id" : 5, "name" : "matt", "part" : "staff", "title" : "lab" })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find()
{ "_id" : 5, "name" : "matt", "part" : "staff", "title" : "lab" }
Remove() //db.콜렉션명.remove(delete_creiteria)
>db.mycol.remove({'title' : 'mongo'})
Projection
일반적인 SQL 쿼리문에서 "select" 구문에 해당하는 Projection은 find() 메소드의 두번째 인자값에 해당.
/* sample query */ db.tbl.find( { num: { $gt: 29} }, { val1: 1, val2: 1 } ◀ projection ).limit(10)
위의 코드에서 "projection"으로 표시된 부분
만약 _id 필드를 projection에서 제외하면 추후에 projection을 합칠 때 문제가 생김.
위 구문에서 val1 필드 값인 1은 추출한 콜렉션에서 val1 필드를 포함하고 반대로 val1 필드 값이 0이라면 추출한 콜렉션에서 val1 필드를 제외. 따라서 위 구문은 val1과 val2 필드를 포함하겠다는 뜻.
1.추출할 콜렉션에서 특정 필드를 제외 쿼리 예시
db.t_col.find({ "view_count": { $gt: 29 }, { "title":0 })
위의 쿼리를 실행하면 view_count값이 29보다 큰 document들을 선택하고, 선택된 document들의 필드 중 "title" 필드를 제외.
2 .2개의 필드와 _id 필드를 포함하는 쿼리.
db.t_col.find({ "view_count": { $gt: 29 }, { "title":1, "cont":1 })
위의 쿼리를 실행하면 view_count값이 29보다 큰 document들을 선택하고, 선택된 document들의 필드 중 "title", "cont", "_id" 필드만 가져옴.
3. 2개의 필드를 포함하고 _id 필드를 제외하는 쿼리.
db.t_col.find({ "view_count": { $gt: 29 }, { "title":1, "cont":1, "_id":0 })
위의 쿼리를 실행하면 view_count값이 29보다 큰 document들을 선택하고, 선택된 document들의 필드 중 "_id"필드를 제외하고 "title", "cont" 필드만 가져옴
'Database Study > MongoDB' 카테고리의 다른 글
[Mongodb]웹서비스컴퓨팅_9주차 (0) | 2019.12.03 |
---|---|
[Mongodb]웹서비스컴퓨팅_7주차 (0) | 2019.10.15 |
[Mongodb]웹서비스컴퓨팅_6주차 (0) | 2019.10.01 |
[Mongodb]웹서비스컴퓨팅_5주차 (0) | 2019.09.24 |
[Mongodb]웹서비스컴퓨팅_3주차 (0) | 2019.09.10 |