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 _idviệc tạo trên studentSchemanhưng _idviệc giữ lại trên các đối tượng trong performancemảng các tài liệu phụ. Không chắc chắn nếu cả hai _id: falsevà id: falsecầ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:falsevà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 _idtrườ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"
}
]
}
_idlà 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.
_idcá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.