documento Mongo JSON -> JSON -> BSON
Domanda
Sto lavorando con Node.js per costruire un server socket web che utilizza MongoDB.
Sto usando nodo-mongodb-native come la biblioteca per l'accesso mongo db.
Quando chiamo console.log (sys.inspect (voce)) su un oggetto dal db ho qualcosa che assomiglia a questo:
{ _id: { id: 'L?#&\u008e\u00ad\u000e\u008f\u0014\u0005\u0000\u0000' }
, y: 3
, favorite_color: 'orange'
, x: 14766
}
in modo da sto indovinando l'id è l'id oggetto BSON che mongo usi.
Ho bisogno di inviare questo oggetto al browser del client Web utilizzando JSON, fosse fatto alcune cose ad esso, e quindi inviarlo al server.
Quando ho JSON.stringify (voce), ottengo qualcosa che assomiglia a questo:
{"_id":"4c3f23268ead0e8f14050000","y":3,"favorite_color":"orange","x":14766}
Quindi, l'id è stato trasformato in una stringa esadecimale codificata. Se invio al cliente, e il client invia indietro, ora ho bisogno di aggiornarlo nel db. Corro JSON.parse (voce) per arrivare ad essere un oggetto normale, ma sembra ancora come questo:
{ _id: '4c3f23268ead0e8f14050000'
, y: 3
, favorite_color: 'orange'
, x: 14766
}
e che _id non possono essere utilizzati per cercare in MongoDB.
Come posso riconvertirlo in un formato che sarà in grado di essere utilizzato per le ricerche su Mongo?
- aggiornamento -
È interessante notare che posso usare findOne({_id:item._id}, collection)
per ottenere il documento, ma se faccio questo:
findOne({_id:{id : item._id.id}}, collection)
non ricevo un risultato. Credo che ci sia qualcosa di speciale circa l'oggetto mongo _id.
Sia {_id:item._id}
e {_id:{id : item._id.id}}
quando pratiche di dumping su questo aspetto:
{ _id: { id: 'L?#&\u008e\u00ad\u000e\u008f\u0014\u0005\u0000\u0000' } }
- Un altro aggiornamento DELIBERATO ---
C'è stato qualche manipolazione id oggetto in un file di test di integrazione.
objectId = new mongo.ObjectID.createFromHexString ( '47cc67093475061e3d95369d'); darà la _id che sto cercando.
objectId.toHexString () restituirà la stringa esadecimale che si presenta come '47cc67093475061e3d95369d'
Soluzione
La mia ipotesi è che interpreta sys.inspect
un ObjectId come un oggetto contenente un immobili id
. Questo è quello che stiamo vedendo in discarica.
MongoDB considera l'ObjectId come un valore binario 12 byte, non come un oggetto. Quindi MongoDB non sa di qualsiasi proprietà id
. È per questo che la seguente query non produce risultato:
findOne({_id: {id: item._id.id}}, collection)
Di seguito funziona, in quanto solo considera entrambi i valori come valori binari:
findOne({_id: item._id}, collection)