2017-10-30 11 views
1

私はすべての可能な方法でこれを実行しようとしましたが、すべてのリソースを検索しましたが、些細な問題に見えるものを見つけることができませんでした。MongoDB集約で文字列を数値にキャストする

私は、他の場所からインポートされた巨大なコレクションを持っています。fieldは数値型ではなく文字列です。 fieldでソートしようとすると、自然に数字ではなく文字列ソートが行われます。 $sumまたは$avgを行うと、それぞれ0およびnullが得られます。

必然的に私の文字列フィールドは数値に変換されますが、このような機能は存在しないようです。私は$add: ['field', 0]または$multiply: ['field', 1]のようなトリックを試してみましたが、算術演算子は明らかに数値を求めています。自動変換は行われないようです。私はこれを$group$projectの段階で無駄に試しました。

その他すべてが失敗した場合は、fieldに対応する新しい数値フィールドを挿入してコレクションを更新する必要がありますが、コレクションが外部ソースから頻繁に完全に再インポートされるため、これは推奨されていません。

+0

の可能な重複[MongoDBの中の数値に文字列を変換する方法(https://stackoverflow.com/questions/29487351/how-to-convert-string-to-numerical-values-in-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"]} ]} ]} 
     }} 
    }} 
      ]); 
関連する問題