Это время этот вопрос был развенчан, а сам я очень устал от ложных ответов здесь.
Код как единое целое. Единственные проблемы, которые могут возникнуть, - это то, что вы отправляете неправильные вещи или имеете неправильную коллекцию, а также последний вопрос относительно самого значения _id
.
Вам не нужно ничего другого, кроме «сырой» выразить и мангуста для этого, чтобы работать, так как мой список доказывает:
var async = require('async'),
express = require('express'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/simple');
var personSchema = new Schema({
firstName: String,
lastName: String,
email: String
});
var Person = mongoose.model('Person', personSchema);
var app = express();
mongoose.connection.on('open',function(err) {
async.series(
[
function(callback) {
Person.remove({},callback);
},
function(callback) {
Person.create({
firstName: "John",
lastName: "Doe",
email: "[email protected]"
},callback);
}
],
function(err,results) {
if (err) throw err;
console.log(
"Created and call in URL: %s",
results[1]._id
);
// setup routes
app.get('/people', function(req,res) {
Person.find(function(err,docs) {
res.send(docs)
});
});
app.get('/people/:id', function(req,res) {
Person.findById(req.params.id,function(err,doc) {
res.send(doc);
});
});
app.listen(3000);
console.log("ready");
}
);
});
Что дает выход как:
Итак, когда вы звоните сервер на /people
URL вы получите:
[
{
"_id":"55e0464e66e13f6506e8e38e",
"firstName":"John",
"lastName":"Doe",
"email":"[email protected]",
"__v":0
}
]
в качестве ответа.
И когда вы звоните с идентификатором, как в /people/55e0464e66e13f6506e8e38e
тогда вы получите:
{
"_id":"55e0464e66e13f6506e8e38e",
"firstName":"John",
"lastName":"Doe",
"email":"[email protected]",
"__v":0
}
Как и следовало ожидать.
Так что если ваше приложение не работает, то вы либо не отправляете то, что считаете себя, либо фактически имеете значение String для значения _id
в коллекции, либо оно полностью несовместимо с именем коллекции или базы данных. Все URL-адреса должны работать, и если ни один из них не работает, последний имеет значение.
В случае _id
будучи строку, то схема не так и должно быть:
var personSchema = new Schema({
_id: String
firstName: String,
lastName: String,
email: String
},{ "_id": false });
Где самое главное, помимо установки правильного типа для _id
поля в схеме также { "_id": false }
.
Это потому, что вам нужно это, чтобы сообщить mongoose не попытка проанализировать «строку» в ObjectId
, как это обычно делается по умолчанию.
Без этой установки «строка» всегда терпит неудачу.
Но это объявление является доказательством того, что работает, а также единственное изменение действительно необходимо, если на самом деле _id
содержит «строку» или другой тип. Так что если Number
, то оба устанавливают схему для _id: Number
, а также { "_id": false }
, в противном случае возникают такие же причины сбоя.
Для чистой глупости затем изменить свой список, чтобы:
var personSchema = new Schema({
_id: { type: String, default: "55e0464e66e13f6506e8e38e" },
firstName: String,
lastName: String,
email: String
},{ "_id": false });
И смотреть это работает каждый раз, также.
И, пожалуйста, удалите { "_id": false }
и посмотрите, как он сбой, поэтому становится понятным, почему это необходимо, когда тип _id
предназначен для переопределения.
Вы пытались использовать конструктор ObjectId, такой как http://stackoverflow.com/questions/6578178/node-js-mongoose-js-string-to-objectid-function? – mguimard
Я не уверен, как вы это понимаете, вы имели в виду что-то вроде: http://pastebin.com/nFxSrZqw Если да, к сожалению, это не работает для меня в любом случае :( – Andurit
Имеет ли этот MongoDB данные, используя ваше приложение и через mongoose или любым другим способом? –