쿼리 키의 MongoDB 와일드카드
쿼리에서 키를 와일드카드로 지정할 수 있습니까?예를 들어, 다음과 같은 기록을 볼 때, 저는 다음과 같은 일을 하고 싶습니다..find({'a.*': 4})
이 문제는 https://jira.mongodb.org/browse/SERVER-267 에서 논의되었지만 해결되지 않은 것 같습니다.
{
'a': {
'b': [1, 2],
'c': [3, 4]
}
}
요청하신 대로 이것은 불가능합니다.연결한 서버 문제가 "우리가 확신할 수 없는 문제"에 있습니다.
MongoDB는 어레이 사용과 관련된 인텔리전스를 가지고 있으며, 이러한 기능을 둘러싼 복잡성의 일부라고 생각합니다.
다음 쿼리 사용db.foo.find({ 'a.b' : 4 } )
이 쿼리는 다음 문서와 일치합니다.
{ a: { b: 4 } }
{ a: [ { b: 4 } ] }
그럼 "와일드카드"는 여기서 무엇을 할까요? db.foo.find( { a.* : 4 } )
첫 번째 서류와 일치합니까?두 번째는?
게다가, 이것은 의미론적으로 무엇을 의미합니까?설명한 대로 쿼리는 효과적으로 "문서의 필드 값이 4인 문서 찾기"입니다.그것은 좀 특이합니다.
당신이 성취하고자 하는 구체적인 의미가 있습니까?문서 구조를 변경하면 원하는 쿼리를 얻을 수 있습니다.
저는 같은 문제에 직면했기 때문에 이 질문을 접하게 되었습니다.여기서 승인된 답변 제공자는 지원되지 않는 이유를 설명하지만 실제로 문제 자체를 해결하지는 못합니다.
언젠가 누군가 이 게시물을 발견할 경우를 대비하여 여기서 와일드카드 사용을 중복하고 공유할 수 있는 솔루션을 만들었습니다.
MongoDB 쿼리에서 와일드카드를 사용하려는 이유는 무엇입니까?저의 경우 사전에서 일치하는 항목을 찾을 수 있도록 이 "기능"이 필요했습니다(질문 코드가 보여주는 것처럼).
대안은 무엇입니까?역방향 맵(DNS 작동 방식과 매우 유사)을 사용하고 간단히 사용합니다.이 경우 다음과 유사한 기능을 사용할 수 있습니다.
{
"a": {
"map": {
"b": [1, 2, 3],
"c": [3, 4]
},
"reverse-map": {
"1": [ "b" ],
"2": [ "b" ],
"3": [ "b", "c" ],
"4": [ "c" ]
}
}
}
메모리가 더 필요하고 삽입/업데이트 작업은 이 세트가 항상 대칭적인지 확인해야 하지만 문제를 해결합니다.이제, 상상 속의 질문을 하는 대신에
db.foo.find( { a.map.* : 4 } )
나는 실제 질문을 할 수 있습니다.
db.foo.find( { a.reverse-map.4 : {$exists: true} } )
특정 값을 가진 모든 항목을 반환합니다(예:4
)
알아요. 이 방법은 메모리가 더 많이 필요하고 좋은 성능(문서 읽기)을 얻으려면 인덱스를 제대로 관리해야 합니다. 그래도 제 사용 사례에 도움이 됩니다.이것이 언젠가 다른 누군가에게도 도움이 되기를 바랍니다.
MongoDB v3.4+ 버전부터 변환하는 데 사용할 수 있습니다.a
쿼리를 위해 k-v 튜플 배열로.
db.collection.aggregate([
{
"$addFields": {
"a": {
"$objectToArray": "$a"
}
}
},
{
$match: {
"a.v": 4
}
},
{
"$addFields": {
// cosmetics to revert back to original structure
"a": {
"$arrayToObject": "$a"
}
}
}
])
언급URL : https://stackoverflow.com/questions/6179871/mongodb-wildcard-in-the-key-of-a-query
'programing' 카테고리의 다른 글
코드가 DEBUG/릴리스 빌드에서 실행 중인지 여부를 확인하는 방법은 무엇입니까? (0) | 2023.05.13 |
---|---|
HTML 형식의 전자 메일을 보내는 방법은 무엇입니까? (0) | 2023.05.13 |
GitLab 토큰을 사용하여 인증 없이 복제 (0) | 2023.05.13 |
Angular 2 이상 / Typescript에서 글로벌 변수를 선언하려면 어떻게 해야 합니까? (0) | 2023.05.13 |
시작 시 셸 스크립트 실행 방법 (0) | 2023.05.13 |