반응형

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" 필드만 가져옴

반응형

+ Recent posts