2012-05-09 31 views
25

Tôi đang sử dụng mongoose để vận hành mongodb. Bây giờ, để thử nghiệm, tôi muốn chèn một số dữ liệu vào mongodb bằng kết nối gốc.Làm thế nào để chèn một tài liệu vào mongodb sử dụng mongoose và nhận được id được tạo ra?

Nhưng câu hỏi là làm thế nào để có được id được tạo sau khi chèn?

tôi đã cố gắng:

var mongoose = require('mongoose'); 

mongoose.connect('mongo://localhost/shuzu_test'); 

var conn = mongoose.connection; 

var user = { 
    a: 'abc' 
}; 

conn.collection('aaa').insert(user); 

console.log('User:'); 
console.log(user); 

Nhưng nó in:

{ a: 'abc' } 

Không có lĩnh vực _id.

Trả lời

36

Bạn có thể tự tạo _id và gửi cho cơ sở dữ liệu.

var ObjectID = require('mongodb').ObjectID; 

var user = { 
    a: 'abc', 
    _id: new ObjectID() 
}; 

conn.collection('aaa').insert(user); 

Đây là một trong những tính năng yêu thích của tôi về MongoDB. Nếu bạn cần tạo một số đối tượng, được liên kết với nhau, bạn không cần phải thực hiện nhiều chuyến đi khứ hồi giữa ứng dụng và db. Bạn có thể tạo tất cả các id trong ứng dụng và sau đó chỉ cần chèn tất cả mọi thứ.

+0

Liệu không phải là mới ObjectId() cần phải làm một chuyến đi vòng để có được một "có sẵn" ID ... nếu không, sẽ không có một cơ hội cực nhỏ của một vụ va chạm? ((ví dụ, trên MSSQL, NEWID() là phù hợp với RFC4122 ... và đảm bảo không có va chạm, nhưng nó xảy ra ở phía DB.)) –

+0

Tôi đã làm một số nghiên cứu thêm, và đi qua SOQuestion này [https: // stackoverflow.com/a/5694803/1327508] giải thích cả cách oid được tạo ra và 3 (+1 trong nhận xét) kịch bản cho va chạm ... & câu trả lời của tôi về cơ bản là "không, bạn đúng", vì cách oid được tạo ra. –

7

Nếu bạn sử dụng .save thì bạn sẽ nhận lại _id trong hàm gọi lại.

var user = new User({ 
    a: 'abc' 
}); 

user.save(function (err, results) { 
    console.log(results._id); 
}); 
0

Bạn có thể sử dụng phương thức Update với upsert: lựa chọn đúng

aaa.update({ 
    a : 'abc' 
}, { 
    a : 'abc' 
}, { 
    upsert: true 
}); 
Các vấn đề liên quan