Làm cách nào để lấy objectID sau khi tôi lưu một đối tượng trong Mongoose?


81
var n = new Chat();
n.name = "chat room";
n.save(function(){
    //console.log(THE OBJECT ID that I just saved);
});

Tôi muốn console.log id đối tượng của đối tượng tôi vừa lưu. Làm cách nào để thực hiện điều đó trong Mongoose?

Câu trả lời:


116

Điều này chỉ làm việc cho tôi:

var mongoose = require('mongoose'),
      Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/lol', function(err) {
    if (err) { console.log(err) }
});

var ChatSchema = new Schema({
    name: String
});

mongoose.model('Chat', ChatSchema);

var Chat = mongoose.model('Chat');

var n = new Chat();
n.name = "chat room";
n.save(function(err,room) {
   console.log(room.id);
});

$ node test.js
4e3444818cde747f02000001
$

Tôi đang sử dụng mongoose 1.7.2 và điều này hoạt động tốt, chỉ cần chạy lại để chắc chắn.


8
một đối tượng phòng không xác định là dấu hiệu của lỗi lưu n. thực hành tốt nhất để thực hiện kiểm tra lỗi trước khi truy cập tài liệu.
ChrisMcJava

3
cả n._id và n.id sẽ trả lại kết quả mong muốn như của cầy mangut 3.8.21
ChrisMcJava

@ChrisMcJava bình luận của bạn là một cứu cánh! Khi chúng ta code nhiều dòng và nhiều hàm, đôi khi chúng ta bỏ qua việc xử lý lỗi sau này, sau này có thể không bao giờ hoặc quên được LOL, Thanks anw!
ksugiarto

Ai đó đã viết câu trả lời ngắn gọn hơn vào một ngày sau đó nhưng tôi nghĩ rằng phần bổ sung trong câu trả lời này có thể hữu ích hơn. Đối với điều đó, tôi cho cái này là phiếu ủng hộ (8 năm xuống dòng, không ít hơn).
Cheesus Toast vào

43

Mongo gửi tài liệu hoàn chỉnh dưới dạng callbackobject để bạn chỉ có thể lấy nó từ đó.

ví dụ

n.save(function(err,room){
  var newRoomId = room._id;
  });

10

Bạn có thể tạo _id theo cách thủ công, sau đó bạn không phải lo lắng về việc kéo nó ra sau.

var mongoose = require('mongoose');
var myId = mongoose.Types.ObjectId();

// then set it manually when you create your object

_id: myId

// then use the variable wherever

Rất hữu ích để biết, mã không đồng bộ được ngăn chặn khi đồng bộ sẽ làm. Cảm ơn!
ryanm

Đó là những gì tôi định làm ban đầu nhưng tôi nghĩ rằng điều đó là không cần thiết phải trung thực. Tuy nhiên, sẽ trả lời một câu hỏi khác.
Cheesus Toast

8

bạn có thể nhận được objectid trong mongoosejs sau khi bạn mới một số mô hình.

Tôi đang sử dụng mã này hoạt động trong mongoose 4, bạn có thể thử nó trong phiên bản khác

var n = new Chat();
var _id = n._id;

hoặc là

n.save((function (_id) {
  return function () {
    console.log(_id);
    // your save callback code in here
  };
})(n._id));

2

Các câu trả lời khác đã đề cập đến việc thêm một cuộc gọi lại, tôi thích sử dụng .then ()

n.name = "chat room";
n.save()
.then(chatRoom => console.log(chatRoom._id));

ví dụ từ tài liệu :.

var gnr = new Band({
  name: "Guns N' Roses",
  members: ['Axl', 'Slash']
});

var promise = gnr.save();
assert.ok(promise instanceof Promise);

promise.then(function (doc) {
  assert.equal(doc.name, "Guns N' Roses");
});

1

Với savetất cả những gì bạn chỉ cần làm là:

n.save((err, room) => {
  if (err) return `Error occurred while saving ${err}`;

  const { _id } = room;
  console.log(`New room id: ${_id}`);

  return room;
});

Đề phòng trường hợp ai đó tự hỏi làm thế nào để có được kết quả tương tự bằng cách sử dụng create:

const array = [{ type: 'jelly bean' }, { type: 'snickers' }];

Candy.create(array, (err, candies) => {
  if (err) // ...

  const [jellybean, snickers] = candies;
  const jellybeadId = jellybean._id;
  const snickersId = snickers._id;
  // ...
});

Kiểm tra tài liệu chính thức


1

Tôi có cái này:

TryThisSchema.post("save", function(next) {
    console.log(this._id);
});

Chú ý đến "bài đăng" ở dòng đầu tiên. Với phiên bản Mongoose của tôi, tôi không gặp khó khăn gì khi nhận giá trị _id sau khi dữ liệu được lưu.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.