[MongoDB] 小数点第 n 位以下の doc を取得して小数点第 m 位の数値で更新するクエリ

Tadashi Shigeoka ·  Sun, March 12, 2017

JavaScript で小数点以下の桁数を取得する方法の応用で、MongoDB で小数点第3位以下の doc を取得して小数点第2位に更新するクエリを書いてみました。

MongoDB | モンゴディービー

var skus = db.skus.find(
  {
    $or: [
      {
        $where: function() {
          var numbers = String(this.price).split('.');
          var result = 0;

          if (numbers[1]) {
            result = numbers[1].length;
          }

          // 小数点第3位以下か判定
          return result > 2;
        }
      },
      {
        $where: function() {
          var numbers = String(this.salePrice).split('.');
          var result = 0;

          if (numbers[1]) {
            result = numbers[1].length;
          }

          return result > 2;
        }
      }
    ]
  }
).toArray();

// 小数点第2位の数値に変換するコンバーター
var converter = function(num) {
  return parseFloat(num.toFixed(2));
};

skus.forEach(function(s){
  if (s.price) {
    s.price = converter(s.price);
  }
  if (s.salePrice) {
    s.salePrice = converter(s.salePrice);
  }

  // printjsononeline(s);

  var ret = db.skus.save(s);
  printjsononeline(ret);
  print('');
});

ポイントは $where: function() { } で price や salePrice が小数点第3位以下か判定している部分です。

$where operator を使うと複雑な条件のクエリも JavaScript でのプログラミングを駆使すれば実現できることが多いので、ぜひ $where を使ってみて下さい。