2010-08-08 7 views
2

Je travaille avec Node.js pour créer un serveur socket Web qui utilise mongodb. J'utilise node-mongodb-native comme bibliothèque pour accéder à mongo db.Document Mongo JSON -> JSON -> BSON

Quand j'appelle console.log (sys.inspect (point)) sur un objet de la db je reçois quelque chose qui ressemble à ceci:

{ _id: { id: 'L?#&\u008e\u00ad\u000e\u008f\u0014\u0005\u0000\u0000' } 
, y: 3 
, favorite_color: 'orange' 
, x: 14766 
} 

donc je devine que l'id est l'ID d'objet BSON que mongo utilise.

Je dois envoyer cet objet au navigateur Web du client à l'aide de JSON, lui demander de faire quelque chose, puis le renvoyer au serveur.

Quand je JSON.stringify (point), je reçois quelque chose qui ressemble à ceci:

{"_id":"4c3f23268ead0e8f14050000","y":3,"favorite_color":"orange","x":14766} 

Ainsi, l'identifiant a été transformé en une chaîne encodée hexagonale. Si je l'envoie au client, et que le client le renvoie, j'ai maintenant besoin de le mettre à jour dans la base de données. Je lance JSON.parse (point) pour obtenir qu'il soit un objet normal, mais il semble encore comme ceci:

{ _id: '4c3f23268ead0e8f14050000' 
, y: 3 
, favorite_color: 'orange' 
, x: 14766 
} 

et que _id ne peut pas être utilisé pour rechercher dans MongoDB.

Comment puis-je le convertir dans un format qui pourra être utilisé pour les recherches sur mongo?

--update--

Il est intéressant que je peux utiliser findOne({_id:item._id}, collection) pour obtenir le document, mais si je fais ceci:

findOne({_id:{id : item._id.id}}, collection)

Je ne reçois pas de résultat. Je suppose qu'il y a quelque chose de spécial à propos de l'objet mongo _id.

deux {_id:item._id} et {_id:{id : item._id.id}} quand jeté sur ressembler à ceci:

{ _id: { id: 'L?#&\u008e\u00ad\u000e\u008f\u0014\u0005\u0000\u0000' } } 

mise à jour --Another RÉSOLU ---

Il y avait une certaine manipulation de l'ID d'objet dans un fichier de test d'intégration.

objectId = nouveau mongo.ObjectID.createFromHexString ('47cc67093475061e3d95369d'); donnera le _id que je cherche.

objectId.toHexString() retourne la chaîne hexagonale qui ressemble à « 47cc67093475061e3d95369d »

+0

Ainsi, votre problème est résolu je suppose? – Aillyn

+0

Non, le vrai problème est que j'ai besoin d'une forme de l'identifiant mongo que je peux envoyer au navigateur client (de préférence en json) que le client peut ensuite renvoyer et qui peut être utilisé pour rechercher l'objet dans mongodb. – RobKohr

Répondre

1

Je pense que sys.inspect interprète un ObjectId comme un objet contenant une propriété id. C'est ce que vous voyez dans la décharge. MongoDB traite l'objet ObjectId comme une valeur binaire de 12 octets, pas comme un objet.

Donc, MongoDB ne connaît aucune propriété id.Voilà pourquoi la requête suivante donne aucun résultat:

findOne({_id: {id: item._id.id}}, collection) 

Ce qui suit fonctionne, car il traite juste les deux valeurs en tant que valeurs binaires:

findOne({_id: item._id}, collection) 
+0

Merci, cela a beaucoup plus de sens maintenant. Est-il possible de convertir cet objet en une chaîne ou un type de données plus portable, puis de le convertir? J'ai besoin de quelque chose à envoyer au navigateur client qui peut être renvoyé pour identifier l'objet. – RobKohr

+0

Vous devriez envoyer le format '4c3f23268ead0e8f14050000' au client, car il semble que ce soit la représentation textuelle standard d'un ObjectId. Dans le shell Mongo, la méthode [toString()] (http://api.mongodb.org/java/current/org/bson/types/ObjectId.html#toString%28%29) renvoie une telle chaîne. Je m'attends à ce que cela soit également implémenté dans node-mongodb-native/node.js. –

+0

Merci pour votre aide! Quelque chose de similaire était disponible dans le cadre de la bibliothèque. – RobKohr

Questions connexes