Comment sérialiser MongoDb ObjectId («uniqueid») en JSON dans nodejs?
Supposons que nous ayons un service de générateur de requêtes B qui crache la requête mongo db lorsqu'il est appelé. Cette requête est reçue par le service A et il l'exécute telle quelle avec le pilote officiel nodejs de mongo db.
Comment envoyer quelque chose comme:
[{
_id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2d96"),
phone: "666"
}, {
_id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2da2"),
phone: "555"
}]
du service B au service A?
ÉDITER:
Ce qui suit fonctionne parfaitement bien:
var q = { _id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2d96") };
const result = await this.db.collection("persons").find(q).toArray();
Ce qui suit ne fonctionne pas:
var q = { _id: { $oid: "5f3258cfbaaccedaa5dd2d96" } }
const result = await this.db.collection("persons").find(q).toArray();
Maintenant,
var q = { _id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2d96") };
JSON.stringify(q)
vous donne: {"_id":"5f3258cfbaaccedaa5dd2d96"}et si vous passez ceci au service A. Vous ne pouvez pas l'utiliser dans le service A comme suit:
const result = await this.db.collection("persons").find(qStr).toArray();
Ou comme,
const result = await this.db.collection("persons").find(JSON.parse(qStr)).toArray();
Réponses
Tu dois:
- Sérialisez vos documents en json étendu à une extrémité
- Désérialisez vos documents de JSON étendu vers des structures de données natives du langage à l'autre extrémité
Voir https://github.com/mongodb/js-bson#node-no-bundling pour savoir comment sérialiser et désérialiser.
Vous ne pouvez pas fournir des hachages annotés de type json étendus aux fonctions de pilote qui attendent des types natifs (qui sont tous, fondamentalement, autres que celui qui analyse spécifiquement json étendu), comme vous avez essayé de le faire.
var q = { _id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2d96") };
const serializedQ = BSON.serialize(q);
const deserializedQ = BSON.deserialize(serializedQ);
const result = await this.db.collection("persons").find(deserializedQ).toArray();
Il existe une norme que MongoDB appelle " Extended JSON " qui définit comment vous pouvez encoder tous les types de données BSON en JSON standard.
Cela deviendra quelque chose comme
{ _id : {$oid: "5f3258cfbaaccedaa5dd2d96"} }
La plupart des outils MongoDB seront capables de convertir vers et depuis ce format.