{} 는 all.db.movies.find({})
db.movies.find({"title": "엘리멘탈"})
db.movies.find({"views": 5})
db.movies.find({"title": "엘리멘탈", "views": 5}) # AND 절
_id는 0으로 하지 않으면 무조건 반환
filter_query 이후, 쿼리로 반환받을 key 지정 가능 - 1: 반환 / 0: 제외
# title
> db.movies.find({}, {"title":1})
[
{ _id: 3, title: '엘리멘탈' },
{ _id: ObjectId("64ff128a0803fe720ebc964c"), title: '엘리멘탈1' },
{ _id: ObjectId("64ff12a20803fe720ebca357"), title: '엘리멘탈2' }
]
> db.movies.find({}, {"title":0})
[
{
_id: 3,
open: { month: 3 },
views: 2,
comment: [
{ contents: '재미o', views: 6 },
{ contents: '재미o', views: 3 },
{ contents: '재밍미징', views: 1 },
{ contents: '재미o', views: 3 },
{ contents: '재밍미징', views: 6 }
]
},
{ _id: ObjectId("64ff128a0803fe720ebc964c"), comment: 1 },
{ _id: ObjectId("64ff12a20803fe720ebca357"), comment: { views: 1 } }
]
> db.movies.find({"views": {$gte: 5, $lte: 10}})
[
{
_id: 3,
title: '엘리멘탈',
open: { month: 3 },
views: 6,
comment: [
{ contents: '재미o', views: 6 },
{ contents: '재미o', views: 3 },
{ contents: '재밍미징', views: 1 },
{ contents: '재미o', views: 3 },
{ contents: '재밍미징', views: 6 }
]
}
]$ne = not equal$in$nin$in 반대$or> db.movies.find({$or: [{"views":6}, {"title": "엘리멘탈1"}]})
[
{
_id: 3,
title: '엘리멘탈',
open: { month: 3 },
views: 6,
comment: [
{ contents: '재미o', views: 6 },
{ contents: '재미o', views: 3 },
{ contents: '재밍미징', views: 1 },
{ contents: '재미o', views: 3 },
{ contents: '재밍미징', views: 6 }
]
},
{
_id: ObjectId("64ff128a0803fe720ebc964c"),
title: '엘리멘탈1',
comment: 1
}
]> db.movies.find({"comment.views": null})
[
{
_id: ObjectId("64ff128a0803fe720ebc964c"),
title: '엘리멘탈1',
comment: 1
},
{
_id: ObjectId("64ff12a20803fe720ebca357"),
title: '엘리멘탈2',
comment: { views: null }
}
]$regex - 문자열 일치 확인> db.movies.find({"comment.contents": "재미o"})
[
{
_id: 3,
title: '엘리멘탈',
open: { month: 3 },
views: 6,
comment: [
{ contents: '재미o', views: 6 },
{ contents: '재미o', views: 3 },
{ contents: '재밍미징', views: 1 },
{ contents: '재미o', views: 3 },
{ contents: '재밍미징', views: 6 }
]
}
]#all 연산자> db.movies.find({"type": {$all: ["공포", "액션", "다큐"]}})
...
> > db.movies.find({"type": {$all: ["공포", "액션", ]}})
[
{
_id: ObjectId("64ff128a0803fe720ebc964c"),
title: '엘리멘탈1',
comment: 1,
type: [ '공포', '로맨스', '액션' ]
}
]> db.movies.find({"type.2": "로맨스"})
> db.movies.find({"type.2": "공포"})
> db.movies.find({"type.2": "액션"})
[
{
_id: ObjectId("64ff128a0803fe720ebc964c"),
title: '엘리멘탈1',
comment: 1,
type: [ '공포', '로맨스', '액션' ]
}
]$size 연산자> db.movies.find({"type": {"$size": 5}})
> db.movies.find({"type": {"$size": 2}})
> db.movies.find({"type": {"$size": 3}})
[
{
_id: ObjectId("64ff128a0803fe720ebc964c"),
title: '엘리멘탈1',
comment: 1,
type: [ '공포', '로맨스', '액션' ]
}
]
> db.movies.find({"type": {$size:{$lte: 5}}})
MongoServerError: Failed to parse $size. Expected a number in: $size: { $lte: 5 }$slice 연산자> db.movies.find({"title":"엘리멘탈"}, {"comment": {"$slice": 2}})
[
{
_id: 3,
title: '엘리멘탈',
open: { month: 3 },
views: 6,
comment: [ { contents: '재미o', views: 6 }, { contents: '재미o', views: 3 } ]
}
]
> db.movies.find({"title":"엘리멘탈"}, {"comment": {"$slice": [2,5]}})
ㄴ 개수
[
{
_id: 3,
title: '엘리멘탈',
open: { month: 3 },
views: 6,
comment: [
{ contents: '재밍미징', views: 1 },
{ contents: '재미o', views: 3 },
{ contents: '재밍미징', views: 6 }
]
}
]> db.movies.find({"comment.contents":"재미o"}, {"comment.$":1})
[
{ _id: 3, comment: [ { contents: '재미o', views: 6 } ] }
]> db.a.find()
{ "_id" : ObjectId("606ed156db3450d20a0cb7ac"), "x" : 5 }
{ "_id" : ObjectId("606ed159db3450d20a0cb7ad"), "x" : 15 }
{ "_id" : ObjectId("606ed15adb3450d20a0cb7ae"), "x" : 25 }
{ "_id" : ObjectId("606ed15edb3450d20a0cb7af"), "x" : [ 5, 25 ] }
// 조회 예상하는 것과 다름
> db.a.find({"x" : {"$gt" : 10, "$lt" : 20}})
{ "_id" : ObjectId("606ed159db3450d20a0cb7ad"), "x" : 15 }
{ "_id" : ObjectId("606ed15edb3450d20a0cb7af"), "x" : [ 5, 25 ] }
// elemMatch를 쓰면 안된다. 배열만 검색한다.
> db.a.find({"x" : {"$elemMatch" : {"$gt" : 10, "$lt" : 20}}})
// min, max를 사용하자.
> db.a.find({"x" : {"$gt" : 10, "$lt" : 20}}).min({"x" : 10}).max({"x" : 20})$elemMatch 사용$where 절을 사용해 임의의 자바스크립트를 쿼리의 일부분으로 실행하면 모든 쿼리를 표현할 수 있다. 따라서 보안상의 이유로 제한해야한다.limit(x) 으로 반환 값 개수 x개로 제한skip(x) x 이후 값 반환sort() document의 key의 오름차순, 내림차순으로 정렬 가능// 좋지 않다. skip이 너무 많다.
> db.user.find(filter).limit(100)
> db.user.find(filter).skip(100).limit(100)
> db.user.find(filter).skip(200).limit(100)
...$lt 와 limit을 조합해 사용 가능// random을 수치만큼 skip 하는건 별로
x = random
db.user.find().skip(x).limit(1)
클라이언트가 보는 커서와 클라이언트 커서가 나타내는 데이터베이스 커서 2가지가 있다.
서버 측에서 보면 커서는 메모리와 리소르를 점유한다. 커서가 더는 가져올 결과가 없거나 클라이언트로부터 종료 요청을 받으면 데이터베이스는 점유하고 있던 리소스를 해제한다. 그러면 데이터베이스가 리소스를 다른 작업에 사용할 수 있으므로 커서도 신속하게 해제해야한다.