2012-04-06 2 views
29

Notes라는 배열 문서가 내장 된 컬렉션 노트가 있습니다. 샘플MongoDB 컬렉션에서 특정 임베디드 문서를 얻는 방법은 무엇입니까?

문서는 다음과 같습니다.

{ 
"_id" : ObjectId("4f7ee46e08403d063ab0b4f9"), 
"name" : "MongoDB", 
"notes" : [ 
      { 
       "title" : "Hello MongoDB", 
       "content" : "Hello MongoDB" 
      }, 
      { 
       "title" : "ReplicaSet MongoDB", 
       "content" : "ReplicaSet MongoDB" 
      } 
     ] 
} 

제목이 "Hello MongoDB"인 노트 만 찾고 싶습니다. 나는 무엇을해야만하는지 알 수 없다.

. 누구든지 나를 도와 줄 수 있어요.

답변

36

오래된 대답 : 다른 답변을 참조하십시오.


난 당신이 요구하는 것을 생각하지 않는다 적어도 일부는 아마지도-감소하지 않고, 가능 할까?

는 여기를 참조하십시오 : Filtering embedded documents in MongoDB

그 대답은 당신이 데이터로 작업 할 방법을 더 벌로, 스키마를 변경 제안합니다.

당신은 일치 "노트 제목을"이 올바른 문서를 다시 얻을 수있는 중 "점 표기법"또는 $ elemMatch을 사용할 수 있습니다

...

> db.collection.find({ "notes.title" : "Hello MongoDB"}, { "notes.title" : 1"}); 

또는 ...

> db.collection.find({ "notes" : { "$elemMatch" : { "title" : "Hello MongoDB"} }}); 

하지만 당신은 다시 전체 배열, 경기의 원인이 아니라 배열 요소를 얻을 것이다.

또한, 뭔가 당신의 현재 설정과 배열의 항목에 어떤 작업을 할 어려울 수 woud ... 생각합니다. 당신이 필요한 경우 쉽게 삭제 등의 작업을 수행 할 수있는 (대답이 제안에 연결로) 당신이 당신의 스키마를 변경하지 않으면

... 나는 배열의 각 요소에 "ID를"추가하는 것을 고려한다.

-3

은이 같은 쿼리를 수행 할 수 있습니다

db.coll.find({ 'notes.title': 'Hello MongoDB' }); 

는 또한 자세한 내용은 docs를 참조 할 수 있습니다.

+8

Hummm 나는 ** title **으로 'Hello MongoDB'** 노트 **를 다시 얻는 방법 만 믿는다. 예제는 메모 배열로 전체 문서 *를 가져올 것이다! –

73

는이 같은 몽고 버전보다 높은 2.2

쿼리를 수행 할 수 있습니다 : 당신은 당신은 $ 또는 $ elemMatch을 사용할 수 있습니다 저스틴 젠킨스

처럼 $elemMatch
+5

이것은 올바른 대답이어야합니다 – KIC

+3

이것은 쿼리에서 _id를 제외하지 않는 한 포함 된 개체와 함께 상위 문서의 _id를 반환합니다. ... { 'notes. $': 1, '_id': 0}); – Ushox

+0

사용중인이 쿼리 구조에 대한 설명서는 어디에 있습니까? – etech

0

을 시도 할 수 있습니다

db.coll.find({ 'notes.title': 'Hello MongoDB' }, {'notes.$': 1}); 

. $ 연산자와 $ elemMatch 연산자는 조건에 따라 배열에서 요소의 하위 집합을 투영합니다.

$ elemMatch 투영 연산자는 명시 적 조건 인수를 취합니다. 이렇게하면 쿼리에없는 조건을 기반으로 프로젝트 할 수 있습니다.

db.collection.find(
    { 
     // <expression> 
    }, 
    { 
     notes: { 
      $elemMatch: { 
       title: 'Hello MongoDB' 
      } 
     }, 
     name: 1 
    } 
) 

은 $ 연산자는 쿼리 문에서 일부 조건에 따라 배열의 요소를 투영합니다.

db.collection.find(
    { 
     'notes.title': 'Hello MongoDB' 
    }, 
    { 
     'notes.title.$': 1, 
     name: 1 
    } 
) 
2

집계를 사용하여 MongoDb 버전 3.2 이상에서이를 수행 할 수 있습니다.

검색어 :

db.Notebook.aggregate(
    { 
     $project: { 
      "notes": { 
       $filter: { 
        input: "$notes", 
        as: "note", 
        cond: { 
         $eq: [ "$$note.title", "Hello MongoDB" ] 
        } 
       } 
      } 
     } 
    } 
) 

결과 :

{ 
    "_id" : ObjectId("4f7ee46e08403d063ab0b4f9"), 
    "notes" : [ 
     { 
      "title" : "Hello MongoDB", 
      "content" : "Hello MongoDB" 
     } 
    ] 
} 

변수에 액세스하는 데 여기에 사용 $$. 여기서 새로 만든 note 변수에 액세스하려면 $filter 안에 사용했습니다.

당신은 약 $filter, $eq$$ 공식 문서에서 자세한 내용을 찾을 수 있습니다.

$ filter : 지정한 조건에 따라 반환 할 배열의 하위 집합을 선택합니다. 조건과 일치하는 요소 만 가진 배열을 반환합니다. 리턴 된 요소는 원래 순서대로 있습니다.

$ eq : 두 값을 비교하여 값이 같거나 유사하지 않으면 true/false를 반환합니다 (...).

$$ : 변수는 모든 BSON 유형 데이터를 보유 할 수 있습니다. 변수 값에 액세스하려면 변수 이름 앞에 이중 달러 기호 ($$)가 붙은 문자열을 사용하십시오.


참고 :

저스틴 Jenkin의 대답은 오래된 여기 KOP의 대답은 컬렉션에서 여러 문서를 반환하지 않습니다. 이 집계 쿼리를 사용하면 필요한 경우 여러 문서를 반환 할 수 있습니다.

나는 이것을 필요로하고 누군가를 돕기 위해 게시하고 싶었다.

관련 문제