programing

쿼리 키의 MongoDB 와일드카드

padding 2023. 5. 13. 09:15
반응형

쿼리 키의 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

반응형