尝试在我的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"}}
我不想使用像
这样的解决方法猫鼬双
支持我的收藏中的负数。 对于你的答案和解决方案而言,还有很多。
答案 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();