2017-10-30 1 views
1

모든 가능한 방법으로이 작업을 시도했지만 모든 리소스를 검색했지만 사소한 문제인 것으로 보이는 솔루션을 찾을 수 없습니다.문자열을 MongoDB 집계에서 숫자로 변환

숫자가 아닌 문자열로 된 field 문서가있는 다른 곳에서 가져온 거대한 모음이 있습니다. field에 정렬을 시도하지만 자연스럽게 숫자가 아닌 문자열 정렬을 수행합니다. $sum 또는 $avg을 수행하면 각각 0null이 산출됩니다.

내가 필사적으로 필요로하는 것은 내 문자열 필드를 숫자 값으로 변환하는 방법이지만 그러한 기능은 존재하지 않는 것 같습니다. 산술 연산자가 분명히 숫자 값을 원하기 때문에 아무런 성공없이 $add: ['field', 0]이나 $multiply: ['field', 1] 같은 트릭을 시도했습니다. 자동 변환이 발생하지 않는 것 같습니다. 난이 $group$project 단계에서 아무 소용이 시도했다.

그 밖의 모든 것이 실패하면 내 field에 해당하는 새 숫자 필드를 삽입하여 내 컬렉션을 업데이트해야하지만이 컬렉션은 외부 소스에서 빈번하고 완전히 다시 가져 오기 때문에 기본 솔루션이 아닙니다.

+0

가능한 중복 https://stackoverflow.com/questions/29487351/how-to-convert-string-to-numerical-values-in-mongodb ([MongoDB의에서 숫자 값으로 문자열을 변환하는 방법]) – dnickless

+0

그 게시물 (https://stackoverflow.com/questions/29487351/how-to-convert-string-to-numerical-values-in-mongodb) 실제로 값을 변환 향해 각도. –

답변

1

여기에 간단한 설명이 나와 있습니다. 모든 양의 정수 (즉, "-"또는 ".")가 없으면 논리가 더 복잡해지기를 바랍니다. 아이디어는 문자열을 문자로 분해하고 "수동으로"int로 변환하는 것입니다. 다음과 같이 입력 문서를 감안할 때 :

{ snum: "34567" } 

는 실제 int이며 새로운 VAR qq, 예를 만듭니다

{ qq: 34567 } 


db.foo.aggregate([ 
{$addFields: {x: {$map: { 
     input: {$range: [0,{$strLenBytes: "$snum"}] } , 
     as: "z", 
     in: { 
      $let: { 
      vars: {c: {$substrBytes:["$snum","$$z",1]}}, 
      in: { 
       "v" : {$switch: 
       { 
       branches: [ 
{ case: {$eq: [ "0", "$$c" ]}, then: 0} 
,{ case: {$eq: [ "1", "$$c" ]}, then: 1} 
,{ case: {$eq: [ "2", "$$c" ]}, then: 2} 
,{ case: {$eq: [ "3", "$$c" ]}, then: 3} 
,{ case: {$eq: [ "4", "$$c" ]}, then: 4} 
,{ case: {$eq: [ "5", "$$c" ]}, then: 5} 
,{ case: {$eq: [ "6", "$$c" ]}, then: 6} 
,{ case: {$eq: [ "7", "$$c" ]}, then: 7} 
,{ case: {$eq: [ "8", "$$c" ]}, then: 8} 
,{ case: {$eq: [ "9", "$$c" ]}, then: 9} 
         ], 
       default: "$$c" 
       } 
       }, 
       exp: {$subtract: [ {$strLenBytes: "$snum"}, {$add:[1,"$$z"]} ]} 
      } 
      } 
     } 
     }} 
    }} 

,{$addFields: {qq: {$reduce: { 
     input: "$x", 
     initialValue: 0, 
     in: {$add: [ "$$value", {$multiply: ["$$this.v", {$pow: [ 10, "$$this.exp"]} ]} ]} 
     }} 
    }} 
      ]); 
관련 문제