programing

Query CosmosDb - 배열에 배열의 항목이 포함되어 있습니다.

powerit 2023. 4. 23. 11:34
반응형

Query CosmosDb - 배열에 배열의 항목이 포함되어 있습니다.

이런 단어가 있는지 모르겠지만, 지금으로서는 "어레이에 배열의 항목이 포함되어 있는 곳"보다 더 잘 설명할 수 없습니다.

이상하게 들릴지 모르지만, 실제로는 그렇지 않다고 생각합니다.또한 Azure CosmosDB에서는 어떻게 하면 좋을지 고민하고 있습니다.

갑시다.다음과 같은 문서가 있습니다(간소화).

{
"id": "2a62fcf4-988f-4ebe-aedc-fb0c664b85d8",
"Title": "Seks års fængsel for overgreb",    
"ZipCodes": [
    {
        "Code": "6500",
        "Name": "Vojens",
        "FoundViaTerm": "Vojens"
    },
    {
        "Code": "6400",
        "Name": "Sønderborg",
        "FoundViaTerm": "Sønderborg"
    },
    {
        "Code": "6700",
        "Name": "Esbjerg",
        "FoundViaTerm": "Esbjerg"
    }
],
"_rid": "k1sVAPf7SQAMAAAAAAAAAA==",
"_self": "dbs/k1sVAA==/colls/k1sVAPf7SQA=/docs/k1sVAPf7SQAMAAAAAAAAAA==/",
"_etag": "\"00001000-0000-0000-0000-5a14898e0000\"",
"_attachments": "attachments/",
"_ts": 1511295374

}

좋아요, 이제 이런 문서를 조회해서 ZipCodes가 어디 있는지 모두 찾아볼게요.코드가 우편 번호 목록에 있습니다(예: '6500', '2700').

난 여기서 퍼즐을...

ARARY_CONTINES 메서드를 찾았습니다.우편번호가 1개만 입력되어 있으면 동작합니다.문제는 리스트가 표시된다는 것입니다.

누가 좀 도와줬으면 좋겠는데, 잘 부탁드립니다.

내 경험에 의하면exprARRAY_CONTAINS (arr_expr, expr [, bool_expr])메서드는 목록 인수를 지원하지 않습니다.

당신의 상황에 따라 코스모스 DB에서 UDF를 사용하는 것이 좋습니다.

저는 당신의 설명대로 샘플 문서를 3개 작성했습니다.

[
  {
    "id": "1",
    "zip": [
      {
        "code": "1111"
      },
      {
        "code": "2222"
      }
    ]
  },
  {
    "id": "2",
    "zip": [
      {
        "code": "2222"
      },
      {
        "code": "3333"
      }
    ]
  },
  {
    "id": "3",
    "zip": [
      {
        "code": "4444"
      },
      {
        "code": "1111"
      },
      {
        "code": "2222"
      }
    ]
  }
]

다음과 같이 UDF 코드의 일부를 참조해 주세요.

function test(zipcode){
    var arrayList = ["1111","2222"]
    var ret = false ;
    for(var i=0 ;i <zipcode.length;i++){
        if(arrayList.indexOf(zipcode[i].code)){
            ret= true;
        }else{
            ret = false;
            break;
        }
    }
    return ret;
}

zip array(c.zip from c)를 선택하고 결과를 루프하여 위의 UDF를 코드 내에서 호출할 수 있습니다.zip[i]논쟁들.

도움이 되길 바랍니다.


요약만:

목록 조건에 포함된 항목을 쿼리하려면 Cosmos DB SQL API의 IN 연산자를 사용합니다.

맘에 들다

SELECT * FROM c WHERE c.ZipCodes[0].Code IN ("6500", "6700")

또는

SELECT DISTINCT c FROM c JOIN zc IN c.ZipCodes WHERE zc.Code IN ("2720", "2610")

저는 이 문제에 대한 다른 해결책을 제안하고 싶습니다.
사용하다EXISTS와 함께ARRAY_CONTAINS다음과 같이 합니다.

SELECT * FROM c
WHERE EXISTS 
(SELECT VALUE z FROM z in c.ZipCodes WHERE ARRAY_CONTAINS(["6500","6700"], z))

다음과 같은 작업을 수행할 수 있습니다.ZipCodes의 각 항목에 대해 zip이 표시되고 확인 중인 코드 배열과 비교됩니다.이 IMHO는 UDF를 사용하는 것보다 훨씬 좋습니다.

{
  query: '
         SELECT DISTINCT value r
         FROM root r
         JOIN zip IN r.zipCodes
         WHERE ARRAY_CONTAINS(@zipIds, zip, true)
         ',
  parameters: [{name: "@zipIds", value: zipIds}]
}

ARARY_CONTENS의 마지막 파라미터는 부분일치를 받아들이도록 함수에 지시합니다.

UDF를 사용하는 것이 보다 쉬운 옵션이라고 생각되는 것 외에, 쿼리 필터에 UDF를 사용하지 않습니다.UDF는 쿼리의 퍼포먼스를 해치기 때문입니다.UDF를 사용하여 쿼리를 지원하도록 설계된 작업 환경에서도 동일한 문제에 직면했지만 실제로는 대부분의 경우 단일 값을 사용하여 쿼리를 수행하며 UDF를 사용하면 실제로 인덱스를 사용하지 않는 쿼리가 발생합니다.따라서 어레이 내에서 여러 값을 검증해야 하는 경우 검증해야 하는 값의 볼륨에 따라 항상 ARAY_CONTENS(c, 1) 또는 ARAY_CONTENS(c, 2) 또는 ...와 같은 것을 쓸 수 있습니다.

고급 솔루션처럼 보이지는 않지만 인덱스를 사용하고 쿼리에서 최상의 성능을 발휘합니다.

언급URL : https://stackoverflow.com/questions/47500720/query-cosmosdb-where-array-contains-items-from-array

반응형