programing

MongoDB 컬렉션 내에 포함된 특정 문서를 가져오는 방법은 무엇입니까?

mytipbox 2023. 6. 27. 23:29
반응형

MongoDB 컬렉션 내에 포함된 특정 문서를 가져오는 방법은 무엇입니까?

저는 Notes라는 배열 문서가 내장된 모음 노트북을 가지고 있습니다.샘플

문서는 아래와 같이 보입니다.

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

"Hello MongoDB"라는 제목의 노트만 알고 싶습니다.나는 무엇을 해야 할지 모르겠어요

의문의 여지가 있습니다누가 나를 도와줄 수 있습니까?

mongo version 2.2 이상에서 이 작업을 수행할 수 있습니다.

다음과 같은 쿼리:

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

로 시도할 수 있습니다.$elemMatch 젠킨스처럼

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


저는 당신이 요구하는 것이 가능하다고 생각하지 않습니다, 적어도 약간의 지도 축소 없이 가능할까요?

MongoDB에서 포함된 문서 필터링을 참조하십시오.

이 대답은 데이터를 사용하는 방법에 더 적합하도록 스키마를 변경할 것을 제안합니다.

"도트 표기법" 또는 $elemMatch를 사용하여 일치하는 "노트 제목"이 있는 올바른 문서를 반환할 수 있습니다.

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

아니면...

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

그러나 일치를 유발한 배열 요소뿐만 아니라 전체 배열을 되찾을 수 있습니다.

또한 현재 설정으로는 배열의 항목에 대한 작업을 수행하기가 어렵습니다.

스키마를 변경하지 않으면(에 연결된 답변에서 알 수 있듯이) ...필요한 경우 쉽게 삭제할 수 있도록 배열의 각 요소에 "ids"를 추가하는 것을 고려해 보겠습니다.

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 유형 데이터를 포함할 수 있습니다.변수 값에 액세스하려면 변수 이름 앞에 이중 달러 기호($$)가 붙은 문자열을 사용합니다.


참고:

Justin Jenkin의 답변은 구식이며 여기서 kop의 답변은 컬렉션에서 여러 문서를 반환하지 않습니다.이 집계 쿼리를 사용하면 필요한 경우 여러 문서를 반환할 수 있습니다.

저는 이것이 필요했고 누군가를 돕기 위해 글을 올리고 싶었습니다.

$ 또는 $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
    }
)

다음과 같은 쿼리를 수행할 수 있습니다.

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

자세한 내용은 문서를 참조하십시오.

언급URL : https://stackoverflow.com/questions/10043965/how-to-get-a-specific-embedded-document-inside-a-mongodb-collection

반응형