Node + Mongoose: Получить последний вставленный ID?

Я хочу получить последний вставленный _id, используя mongoose в качестве оболочки MongoDB для node.js. Я нашел следующий учебник, но я не могу изменить любые модули node, потому что приложение работает на общедоступном сервере:

Получение "последнего вставленного идентификатора" (подсказка - вам нужно взломать Mongoose)

Любые другие идеи? Это то, что я хочу сделать:

  • Вставить нового пользователя
  • Получить _id значение
  • Установить новый сеанс на основе идентификатора пользователя
  • Перенаправление на /

Спасибо!

Ответы

Ответ 1

Я использую mongoose version 1.2.0, и как только я создал новый экземпляр модели mongoose, _id уже установлен.

coffee> u = new User()
[object Object]
coffee> u._id
4dd68fc449aaedd177000001

Я также проверил, что после вызова u.save() _id остается неизменным. Я проверил через MongoHub, что это действительно реальный идентификатор, сохраненный в MongoDB.

Ответ 2

Если вы явно объявляете

    _id: Schema.ObjectId

для вашей модели, ObjectId не будет доступен после нового или сохранить. Вероятно, это ошибка.

Ответ 3

Если вы хотите получить последний вставленный _id вспомогательного объекта, затем создайте объект и добавьте его в элемент. Вот пример в NowJS с использованием MongoDB и Mongoose (для добавления сахара схемы), который затем преобразует результат в JSON для отправки обратно клиенту:

                var nowRoomID = this.now.room;
                var Conversation = mongoose.model('Conversation');
                Conversation.findById(convID, function(error, conversation) {
                    var Blip = mongoose.model('Blip');
                    var createdBlip = new Blip();
                    createdBlip.author= nowUserName;
                    createdBlip.authorid = parsed.authorid;
                    createdBlip.body = revisedText;
                    createdBlip.created_at = new Date();
                    createdBlip.modified_at = new Date();

                    conversation.blips.push(createdBlip);
                    parsed._id = createdBlip._id;  //NOTE: ID ACCESSED HERE
                    message = JSON.stringify(parsed);

                    conversation.save(function (err) {
                        if (!err) {
                            console.log('Success - saved a blip onto a conversation!');
                            nowjs.getGroup(nowRoomID).now.receiveMessage(nowUserName, message);
                        }

                    });

Ответ 4

С MongoDB, если вы явно не указали значение документа _id, тогда клиентский драйвер автоматически установит его в значение ObjectId, Это отличается от баз данных, которые могут генерировать идентификаторы на сервере и нуждаться в другом запросе для его получения, например, с SQL Server scope_identity() или MySQL last_insert_id().

Это позволяет вам вставлять данные асинхронно, потому что не нужно ждать, пока сервер вернет значение _id, прежде чем продолжить.

Итак, как показано на примере ответа Питера, _id доступен до того, как документ будет сохранен в базе данных.

Ответ 5

Я просто получаю идентификатор из документа, переданного обратному вызову, поскольку сохранение возвращает сохраненный документ.

Ответ 6

Проверьте ниже url

http://mongodb.github.io/node-mongodb-native/markdown-docs/insert.html

вы найдете следующий код в указанном URL

    var document = {name:"David", title:"About MongoDB"};
   collection.insert(document, {w: 1}, function(err, records){
  console.log("Record added as "+records[0]._id);
});