Question

Je travaille avec Node.js pour construire un socket serveur Web qui utilise MongoDB.

J'utilise le noeud-mongodb natif comme la bibliothèque d'accès mongo db.

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
}

Je devine que l'id est l'ID d'objet BSON mongo utilisations.

Je dois envoyer cet objet au navigateur Web client à l'aide JSON, leur faire faire des choses à elle, puis l'envoyer 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 le client le renvoie, je maintenant besoin de le mettre à jour dans la db. 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 peuvent pas être utilisés pour consulter MongoDB.

Comment puis-je le convertir en un format qui pourra être utilisé pour la recherche sur mongo?

- mise à jour -

Il est intéressant, 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 le résultat. Je crois qu'il ya quelque chose de spécial à propos de l'objet mongo _id.

Les deux {_id:item._id} et {_id:{id : item._id.id}} lorsque déversé sur ressembler à ceci:

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

- Une autre mise à jour RÉSOLU ---

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

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

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

Était-ce utile?

La solution

Je suppose que sys.inspect interprète ObjectId comme un objet contenant un propriété id. C'est ce que vous voyez dans la décharge.

MongoDB traite le ObjectId en tant que valeur binaire de 12 octets, et non pas comme un objet. Alors MongoDB ne connaît pas une propriété id. C'est la raison pour laquelle la requête suivante ne 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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top