【问题标题】:mongoose - divide and round猫鼬 - 分而治之
【发布时间】:2015-01-25 17:29:03
【问题描述】:

嘿,我的问题很简单,但我想不通: 我有一个巨大的猫鼬集合player 和一个字段money。如何将此值除以 100 并获得整数(无小数)

我试过了

players.update({}, {$mul: {'money':.01}}, {multi: true}).exec()

它可以除以100,但我不知道如何四舍五入?

顺便说一句,为什么官方 mongoose 文档中没有关于 $mul 运算符的文档? http://mongoosejs.com/docs/3.0.x/docs/api.html

谢谢大家

【问题讨论】:

  • $mul 是 MongoDB 运算符,与 Mongoose 无关。你会发现它的文档here

标签: node.js mongodb mongoose


【解决方案1】:

目前 MongoDb 没有任何内置的运算符来支持 Math.ceil()Math.floor() 函数。您需要在应用程序服务器上执行此操作,或者编写驻留在数据库服务器上并执行相同操作的 javascript 函数。

在应用代码中实现:

Players.find().forEach(function(doc){
var updated = Math.ceil(doc.money/100);
Players.update({"_id":doc._id},{$set:{"money":updated}});
})

将其实现为服务器端 Javascript 函数:

db.system.js.insert({"_id":"updateMoney","value":function(num){
    db.players.find().forEach(function(doc){
    var updated = Math.ceil(doc.money/num);
    db.players.update({"_id":doc._id},{$set:{"money":updated}});
})
}})

并从 mongoose 调用函数:

mongoose.connection.on("open", function(err){
  mongoose.connection.db.eval("updateMoney(100)", function (err, retval) {
      console.log('err: '+err);
      console.log('retval: '+retval);
  });
});

$mul 是一个 mongoDB 运算符,mongoose 是一个 API,它使我们能够使用这些运算符查询 mongodb。

【讨论】:

  • 谢谢。它回答了我的问题。我想一次更新整个集合,但似乎不可能。你知道我们是否可以定义自己的运算符吗?
  • 请查看我的更新答案以在一次操作中更新它。该脚本需要存在于数据库服务器上并从 mongoose API 调用。如果我们要实现自己的运算符,我们需要在 mongodb c++ 源代码中进行并构建它。
【解决方案2】:

对于 Mongoose 4 和 4+ 版本,您有 getter 和 setter。所以转到播放器模式和 将set: v => Math.round(v) 添加到您的金钱 字段。 喜欢

money: {
  type: Number,
  set: v => Math.round(v)
  ...
}

【讨论】:

    猜你喜欢
    • 2013-11-09
    • 2013-01-31
    • 2012-03-04
    • 2011-05-22
    • 2014-10-20
    • 2014-12-12
    • 2013-02-02
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多