programing

중첩된 개체를 쿼리하려면 어떻게 해야 합니까?

showcode 2023. 3. 11. 09:37
반응형

중첩된 개체를 쿼리하려면 어떻게 해야 합니까?

중첩된 개체 표기로 mongoDB를 조회할 때 문제가 발생했습니다.

db.messages.find( { headers : { From: "reservations@marriott.com" } } ).count()
0
db.messages.find( { 'headers.From': "reservations@marriott.com" }  ).count()
5

내가 뭘 잘못하고 있는지 볼 수가 없어.중첩된 개체 표기법이 도트 표기 쿼리와 동일한 결과를 반환할 것으로 예상됩니다.어디가 틀렸지?

db.messages.find( { headers : { From: "reservations@marriott.com" } } )

다음 위치에서 문서에 대해 쿼리합니다.headers 동등. { From: ... }에는 다른 필드가 없습니다.


db.messages.find( { 'headers.From': "reservations@marriott.com" } )

이것은, 다음의 점만을 대상으로 하고 있습니다.headers.From필드, 에 포함되거나 누락된 다른 필드의 영향을 받지 않습니다.headers.


도트 표기 문서

MongoDB 컬렉션과 서브문서에 대한 문의는 혼동이 많기 때문에 위의 답변을 예로 들어 설명할 가치가 있다고 생각합니다.

먼저 컬렉션에 삽입한 오브젝트는 다음 두 가지뿐입니다.message다음과 같이 합니다.

> db.messages.find().pretty()
{
    "_id" : ObjectId("5cce8e417d2e7b3fe9c93c32"),
    "headers" : {
        "From" : "reservations@marriott.com"
    }
}
{
    "_id" : ObjectId("5cce8eb97d2e7b3fe9c93c33"),
    "headers" : {
        "From" : "reservations@marriott.com",
        "To" : "kprasad.iitd@gmail.com"
    }
}
>

질의의 결과는 무엇입니까?db.messages.find({headers: {From: "reservations@marriott.com"} }).count()

쿼리는 1개여야 합니다.이러한 조회는 다음 위치에 있습니다.headers목적과 같다{From: "reservations@marriott.com"}다른 필드는 포함되지 않습니다.그렇지 않으면 하위 항목 전체를 필드 값으로 지정해야 합니다.

그래서 @Edmondo1984의 답변에 따르면

하위 문서가 필드 순서를 포함하여 지정된 하위 문서와 정확히 일치하는 경우 하위 문서 내에서 일치 항목을 선택합니다.

위의 문장에서 아래 쿼리 결과는 어떻게 해야 합니까?

> db.messages.find({headers: {To: "kprasad.iitd@gmail.com", From: "reservations@marriott.com"}  }).count()
0

그리고 만약 우리가 그 순서를 바꾼다면?From그리고.To즉, 두 번째 문서의 하위 문서와 동일한가?

> db.messages.find({headers: {From: "reservations@marriott.com", To: "kprasad.iitd@gmail.com"}  }).count()
1

따라서 필드 순서를 포함하여 지정된 하위 항목과 정확히 일치합니다.

도트 연산자를 사용하는 것은 모든 사람에게 매우 명확하다고 생각합니다.아래 쿼리의 결과를 보겠습니다.

> db.messages.find( { 'headers.From': "reservations@marriott.com" }  ).count()
2

위의 예와 같은 설명을 통해 하위 문서를 통한 질의에 대해 보다 명확하게 알 수 있기를 바랍니다.

2개의 쿼리 메커니즘은 "Subdocuments:

필드에 포함된 문서(, 하위 문서)가 있는 경우, 전체 하위 문서를 필드 값으로 지정하거나 점 표기법을 사용하여 하위 문서에 "접근"하여 하위 문서의 개별 필드 값을 지정할 수 있습니다.

하위 문서 내에서 동일 일치 항목은 하위 문서가 필드 순서를 포함하여 지정된 하위 문서와 정확히 일치하는 경우 문서를 선택합니다.


다음 예제에서 조회는 필드 생산자의 값이 필드만 포함하는 하위 문서인 모든 문서와 일치합니다.company 「」을 사용하여, 「」으로 합니다.'ABC123'[ ] 및 [ ]address 「」을 사용하여, 「」으로 합니다.'123 Street' 는 다음과 같습니다.

db.inventory.find( {
    producer: {
        company: 'ABC123',
        address: '123 Street'
    }
});

언급URL : https://stackoverflow.com/questions/16002659/how-to-query-nested-objects

반응형