[MongoDB] 小数点第 n 位以下の doc を取得して小数点第 m 位の数値で更新するクエリ
JavaScript で小数点以下の桁数を取得する方法の応用で、MongoDB で小数点第3位以下の doc を取得して小数点第2位に更新するクエリを書いてみました。
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 を使ってみて下さい。