Câu trả lời:
Thật đơn giản, bạn có thể định nghĩa điều này trong phần phụ:
var mongoose = require("mongoose");
var subSchema = mongoose.Schema({
//your subschema content
},{ _id : false });
var schema = mongoose.Schema({
// schema content
subSchemaCollection : [subSchema]
});
var model = mongoose.model('tablename', schema);
{ _id: false }
, cả hai cấp lược đồ phụ đều không có id. Bất kỳ cách nào để làm việc xung quanh hành vi này?
{ _id : true }
?
let studentSchema = new Schema({ studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }, { _id: false });
thành điều này: let studentSchema = new Schema({ _id: false, id: false, studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] });
và điều đó đã dừng _id
việc tạo trên studentSchema
nhưng _id
việc giữ lại trên các đối tượng trong performance
mảng các tài liệu phụ. Không chắc chắn nếu cả hai _id: false
và id: false
cần thiết.
Bạn có thể tạo tài liệu phụ mà không cần lược đồ và tránh _id
. Chỉ cần thêm _id:false
vào khai báo tiểu văn của bạn.
var schema = new mongoose.Schema({
field1:{
type:String
},
subdocArray:[{
_id:false,
field :{type:String}
}]
});
Điều này sẽ ngăn việc tạo một _id
trường trong suboc của bạn.
Đã thử nghiệm ở Mongoose v5.9.10
Tôi đang sử dụng mongoose 4.6.3 và tất cả những gì tôi phải làm là thêm _id: false trong lược đồ, không cần tạo ra một biểu đồ con.
{
_id: ObjectId
subDocArray: [
{
_id: false,
field: "String"
}
]
}
_id
là một lĩnh vực chứ không phải là một ràng buộc.
_id = mongoose.Types.ObjectId()
, liệu đó có phải là duy nhất trên toàn bộ sưu tập không?
Bạn có thể sử dụng một trong hai
var subSchema = mongoose.Schema({
//subschema fields
},{ _id : false });
hoặc là
var subSchema = mongoose.Schema({
//subschema content
_id : false
});
Kiểm tra phiên bản cầy mangut của bạn trước khi sử dụng tùy chọn thứ hai
Nếu bạn muốn sử dụng một lược đồ được xác định trước (với _id) làm văn bản con (không có _id), bạn có thể làm như sau trong lý thuyết:
const sourceSchema = mongoose.Schema({
key : value
})
const subSourceSchema = sourceSchema.clone().set('_id',false);
Nhưng điều đó không làm việc cho tôi. Vì vậy, tôi đã thêm rằng:
delete subSourceSchema.paths._id;
Bây giờ tôi có thể bao gồm subSourceSchema trong tài liệu gốc của mình mà không cần _id. Tôi không chắc đây là cách sạch sẽ để làm điều đó, nhưng nó hoạt động.
_id
các trường ngay cả trong bộ sưu tập subSchema, hoặc chỉ trong trường hợp subSchema đang được sử dụng để nhúng dưới dạng mảng của các mục tài liệu phụ? Tôi hỏi điều này đặc biệt vì câu hỏi của riêng tôi về SO ngày hôm nay.