Documento Mongo JSON -> JSON -> BSON
Pergunta
Estou trabalhando com o Node.js para criar um servidor de soquete da Web que usa o MongoDB.
Estou usando o nó-mongodb-nativo como a biblioteca para acessar o Mongo DB.
Quando eu ligo para console.log (sys.inspect (item)) em um objeto do banco de dados, recebo algo que se parece com o seguinte:
{ _id: { id: 'L?#&\u008e\u00ad\u000e\u008f\u0014\u0005\u0000\u0000' }
, y: 3
, favorite_color: 'orange'
, x: 14766
}
Então, acho que o ID é o ID do objeto BSON que Mongo usa.
Preciso enviar esse objeto para o navegador da Web do cliente usando o JSON, fazer com que eles façam algumas coisas e enviá -lo de volta ao servidor.
Quando eu JSON.Stringify (Item), recebo algo que se parece com o seguinte:
{"_id":"4c3f23268ead0e8f14050000","y":3,"favorite_color":"orange","x":14766}
Portanto, o ID foi transformado em alguma corda codificada hexadecimal. Se eu o enviar para o cliente e o cliente o enviar de volta, agora preciso atualizá -lo no banco de dados. Eu corro JSON.Parse (item) para fazer com que seja um objeto normal, mas ainda se parece com o seguinte:
{ _id: '4c3f23268ead0e8f14050000'
, y: 3
, favorite_color: 'orange'
, x: 14766
}
e que _id não pode ser usado para procurar em MongoDB.
Como posso convertê -lo de volta em um formato que poderá ser usado para pesquisas no Mongo?
--atualizar--
Curiosamente eu posso usar findOne({_id:item._id}, collection)
Para obter o documento, mas se eu fizer isso:
findOne({_id:{id : item._id.id}}, collection)
Eu não recebo um resultado. Eu acho que há algo especial no objeto Mongo _id.
Ambos {_id:item._id}
e {_id:{id : item._id.id}}
Quando despejado, fique assim:
{ _id: { id: 'L?#&\u008e\u00ad\u000e\u008f\u0014\u0005\u0000\u0000' } }
-Outra atualização resolvida ---
Havia alguma manipulação de identificação de objeto em um arquivo de teste de integração.
objectId = new Mongo.ObjectId.CreateFromHexString ('47CC67093475061E3D95369D'); Darei a _id que estou procurando.
ObjectId.ToHexString () retornará a sequência hexadecimal que se parece com '47CC67093475061E3D95369D'
Solução
Meu palpite é que sys.inspect
Interpreta um ObjectId como um objeto que contém um id
propriedade. É isso que você está vendo no lixão.
O MongoDB trata o ObjectId como um valor binário de 12 bytes, não como um objeto. Então MongoDB não sabe sobre nenhum id
propriedade. É por isso que a consulta a seguir não produz resultado:
findOne({_id: {id: item._id.id}}, collection)
A seguir, funciona, pois apenas trata os dois valores como valores binários:
findOne({_id: item._id}, collection)