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'

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top