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 を使ってみて下さい。