결론부터 말하자면 MongoDB 2.2 버전 미만에서는 아래의 2가지 방법 밖에 없음.


1. 다 가져오고 client side 에서 필터링

2. MongoDB Map/Reduce



다음은 2.2 버전 이상에서만 가능한 케이스.


일단 날짜별 방문자 리스트를 저장하는 아래와 같은 데이터가 있다고 치자.


{

    date: '2013-05-20',

    visitor: [

        {name:'백충덕', age:34},

        {name:'조조', age:48},

        {name:'관우', age:30}

    ]

}



저런 형태의 데이터가 날짜별로 주루룩 있다고 했을 때,

2013년 5월 20일 방문자 리스트를 가져오려면 아래와 같이 하면 됨.


// 날짜 정보 없이 visitor만

db.col.find({date:'2013-05-20'}, {date:0, visitor:1})




여기서 query를 하나 더 넣어서 visitor 중에 age가 30인 데이터만 가져오려면 아래의 2가지 방법을 사용할 수 있다.


// 1. $elemMatch

db.col.find({date:'2013-05-20'}, {date:0, visitor:{$elemMatch:{age:30}}})


// 2. positional operator를 projection operator 로 사용

db.col.find({date:'2013-05-20', 'visitor.age':30}, {date:0, 'visitor.$':1})




[참조]

$elemMatchhttp://docs.mongodb.org/manual/reference/projection/elemMatch/

$ (positional operator)http://docs.mongodb.org/manual/reference/operator/positional/












Posted by bloodguy

댓글을 달아 주세요

  1. 구일모 2017.09.14 13:28  댓글주소  수정/삭제  댓글쓰기

    배열에서 원하는 원소 하나만 빼내고 싶은데...자꾸만 전체 다큐먼트가 나와버려서 이틀간 고생했던 초보입니다.
    블로그 글 올려주신 내용 보고 드디어 원하는 녀석만 빼낼 수 있었습니다.

    정말 감사 드립니다. 절 구해주셨어요.. 몽고 디비가 제가 예상했던 것만큼 쉽지많은? 않네요.

  2. 홍아 2022.02.28 18:36  댓글주소  수정/삭제  댓글쓰기

    저도 딱 이걸 찾고 있었는데, 통쾌하게 해결해주셨네요. 감사합니다!