2017-09-29 4 views
0

Utilisation du type de données decimal128 dans mon application nodejs.Prise en charge décimale Mongodb

version mongo "3.4.2",

os: {type: "Darwin", nom: "Mac OS X", l'architecture: "x86_64", la version: "16.7.0"

nodejs Version 6.11.2

version 4.11.13 mangouste

mangouste à l'aide de la version du pilote natif MongoDB 2.2.31

config MongoDB:

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

Qu'est-ce que je fais? J'ai mangouste schéma sous-document

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 } 
}); 

Ce schéma est un sous-document du document avec le schéma ci-dessous:

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

Pour ajouter de nouvelles im en utilisant les sous-documents méthode update:

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; 

     }); 

Aussi j'ai utilisé le code ci-dessous:

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; 

    }); 

Mais obtenir la même erreur dans les deux situations:

{ "erreurs": { "name": "MongoError", "message": "$ numberDecimal est pas valable pour stockage.", "driver": true, "index": 0, "code": 52, "errmsg": "$ numberDecimal n'est pas valide pour le stockage ."}, "data": {"ok": 0, "n" : 0, "nModified": 0, "_ id": "59ce4e8cecba947a9a342f37"}}

Je ne veux pas utiliser une solution de contournement comme

mangouste double

pour soutenir les nombres négatifs dans mes collections. Beaucoup de merci pour vos réponses et solutions.

Répondre

0

J'ai rencontré le même problème "$ numberDecimal n'est pas valide pour le stockage" lorsque j'ai essayé d'ajouter un sous-document dans tableau. Je tends à penser cela se produit à cause de

Decimal128.prototype.toJSON = function() { 
    return { "$numberDecimal": this.toString() }; 
} 

de http://mongodb.github.io/node-mongodb-native/2.2/api/node_modules_bson_lib_bson_decimal128.js.html Peut-être que ce n'est pas la meilleure solution, mais solution ci-dessous m'a aidé:

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

Pour ajouter l'article à un tableau existant je:

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