OData - Índice estranho com MongoDB [Mongoose:Erro de transmissão]
Pergunta
Tenho alguns documentos MongoDB com este esquema:
Id: {type: "id", key: true, computed: true, nullable: false},
Name: {type: "string", nullable: false, maxLength: 50}
e esses documentos são expostos como OData por um pequeno aplicativo da web (estou usando Express, JayData e Mongoose).Estes são alguns desses documentos:
{ "_id" : ObjectId("5343fd656b9c5c084b8f2a70"), "Name" : "Service74"},
{ "_id" : ObjectId("5343fd656b9c5c084b8f2a6f"), "Name" : "Service73"},
{ "_id" : ObjectId("5343fd656b9c5c084b8f2a6e"), "Name" : "Service72"},
...
Se eu digitar esse endereço http://localhost:8080/marketplace/Services('5343fd656b9c5c084b8f2a70')
que correspondem a Serviço74 Eu obtenho este resultado:
...
<d:Id>NTM0M2ZkNjU2YjljNWMwODRiOGYyYTcw</d:Id>
<d:Name>Service74</d:Name>
...
Claro que se eu usar o Id especificado no resultado obtenho a mesma página.
O problema ocorre quando tento usar a função mangusto encontrarById:
app.post("/addCompare/:id", function(req, res) {
console.log(req.params.id);
Services.findById(req.params.id, function(err, service) {
if(!err) {console.log(service);}
else {console.log(err);}
});
res.send(200);
});
Eu entendi isso NTM0M2ZkNjU2YjljNWMwODRiOGYyYTcw
e então este erro:
{ message: 'Cast to ObjectId failed for value "NTM0M2ZkNjU2YjljNWMwODRiOGYyYTU5" at path "_id"',
name: 'CastError',
type: 'ObjectId',
value: 'NTM0M2ZkNjU2YjljNWMwODRiOGYyYTU5',
path: '_id' }
Onde estou errado?Diga-me se eu perder alguma outra informação ...
Obrigado.
PS:Encontrei um problema semelhante aqui Mangusto:Falha na transmissão para ObjectId, mas se eu alterar a definição do modelo para o Mongoose (no qual na verdade não declaro o id) incluindo esta definição:
var serviceSchema = mongoose.Schema({
_id: String,
...
nada muda...
Solução
O 5343fd656b9c5c084b8f2a70
é o identificador interno da entidade usada no lado do servidor.Este valor é codificado em base64 em OData, é por isso que você recebe NTM0M2ZkNjU2YjljNWMwODRiOGYyYTcw
no campo ID.A entidade pode ser facilmente recuperada por Id chamando atob(req.params.id)
no ID recebido.