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'

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top