十进制支持Mongodb

时间:2017-09-29 14:13:13

标签: node.js mongodb mongoose decimal

尝试在我的nodejs应用程序中使用decimal128数据类型。

  

mongo version" 3.4.2",

     

os:{type:" Darwin",name:" Mac OS X&#34 ;, architecture:" x86_64",version:" 16.7.0& #34;

     

nodejs版本6.11.2

     

mongoose版本4.11.13

     

mongoose使用原生mongodb驱动程序版本2.2.31

Mongodb config:

storage:
    engine: wiredTiger
    dbPath: "/Users/backend/Desktop/mongo/data"

我在做什么? 我有mongoose子文档架构

const Premises = mongoose.Schema({
  floor           : { type: mongoose.Schema.Types.Decimal128, required: true },
  deleted         : { type: Boolean, default: false },
  created_at      : { type: Date, default: Date.now },
  updated_at      : { type: Date, default: Date.now }
});

此架构是文档的子文档,其架构如下:

...
premises            : [  Premises ],
...

使用更新方法添加新的子文档:

var queryFilter = {
    'deleted'           : false,
    'buildings._id'     : params.building_id
  };

var premise = {
    '_id':                  mongoose.Types.ObjectId(),
    'floor': params['floor']
  };


Block.update(queryFilter, { '$addToSet': { 'buildings.$.premises': premise } }, { safe: true }, function (error, result) {

        result['_id'] = premise['_id'];

        callback(error, result || null);
        return;

      });

我也使用下面的代码:

var queryFilter = {
    'deleted'           : false,
    'buildings._id'     : params.building_id
  };

  var premise = {
    '_id':                  mongoose.Types.ObjectId(),
    'floor': mongoose.Types.Decimal128.fromString(params['floor'])
  };

  Block.update(queryFilter, { '$addToSet': { 'buildings.$.premises': premise } }, { safe: true }, function (error, result) {

    result['_id'] = premise['_id'];

    callback(error, result || null);
    return;

  });

但在两种情况下都会出现同样的错误:

  

{"错误":{"名称":" MongoError","消息":" $ numberDecimal无效   对于   。存储""驱动":真,"指数":0,"代码":52," ERRMSG":& #34; $ numberDecimal   无效   存储"}"数据":{" OK":0," N":0," n修改":0 " _id":" 59ce4e8cecba947a9a342f37"}}

我不想使用像

这样的解决方法
  

猫鼬双

支持我的收藏中的负数。 对于你的答案和解决方案而言,还有很多。

1 个答案:

答案 0 :(得分:0)

我面临同样的问题" $ numberDecimal对存储无效"当我尝试将子文档添加到数组中时。 我倾向于认为这是因为

Decimal128.prototype.toJSON = function() {
  return { "$numberDecimal": this.toString() };
}
来自http://mongodb.github.io/node-mongodb-native/2.2/api/node_modules_bson_lib_bson_decimal128.js.html

也许这不是最好的解决方案,但下面的解决方法帮助了我:

mongoose.Types.Decimal128.prototype.toJSON = mongoose.Types.Decimal128.prototype.toString;

将项目添加到我使用的现有数组中:

  entity.subentities.addToSet(subentity);  
  const updatedEntity = await entity.save();