복붙노트

[MONGODB] 어떻게 MongoDB를 수집 내부 문서에 포함 된 특정을 얻으려면? [복제]

MONGODB

어떻게 MongoDB를 수집 내부 문서에 포함 된 특정을 얻으려면? [복제]

나는 기록이라는 배열 문서를 포함하고있다 컬렉션 노트북이있다. 샘플

아래 그림과 같이 같은 문서 보인다.

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

나는 제목에 "Hello MongoDB를"가 단지 참고를 찾고 싶어요. 나는 무엇을해야 못하고 있어요

쿼리합니다. 캔 사람의 도움 나.

해결법

  1. ==============================

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

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

    나는 적어도 몇 가지 않고, 가능하다 당신이 요구하는 것을 생각하지 않는다 어쩌면지도-감소?

    여기를 참조하십시오 : MongoDB의에서 필터링 포함 된 문서를

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

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

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

    또는 ...

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

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

    또한, 뭔가가 배열의 항목에 어떤 작업을 할 어려울 것이다 대해 ... 당신의 현재 설정과 생각합니다.

    (링크 대답에서 알 수 있듯이) 당신이 당신의 스키마를 변경하지 않으면 ... 나는 당신이 일을 필요한 경우 쉽게 삭제할 좋아 할 수 있도록 배열의 각 요소에 "ID를"추가하는 것을 고려한다.

  2. ==============================

    2.당신은 더 높은 몽고 버전 2.2이 작업을 수행 할 수 있습니다

    당신은 더 높은 몽고 버전 2.2이 작업을 수행 할 수 있습니다

    이 같은 질의 :

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

    당신은 저스틴 젠킨스와 같은 $ elemMatch으로 시도 할 수 있습니다

  3. ==============================

    3.당신은 MongoDB의 버전에서이 작업을 수행 할 수 있습니다 3.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" 
            } 
        ] 
    }
    

    $$ 변수에 액세스하는 데 여기에 사용. 나는 $ 필터 내부에 새로 생성 된 노트 변수에 액세스하려면 여기를 사용했다.

    당신은 $ 필터, $ EQ와 $$에 대한 공식 문서에서 자세한 내용을 찾을 수 있습니다.

    노트 :

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

    나는이 필요하고 도움이 누군가에 게시하고 싶었다.

  4. ==============================

    4.당신은 $ 또는 $ elemMatch를 사용할 수 있습니다. 오퍼레이터 $ 및 $ elemMatch 연산자 조건에 따라 배열의 요소의 서브셋을 투영.

    당신은 $ 또는 $ elemMatch를 사용할 수 있습니다. 오퍼레이터 $ 및 $ 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
        }
    )
    
  5. ==============================

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

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

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

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

  6. from https://stackoverflow.com/questions/10043965/how-to-get-a-specific-embedded-document-inside-a-mongodb-collection by cc-by-sa and MIT license