Ngăn Mongoose tạo thuộc tính _id cho các mục mảng tài liệu phụ


227

Nếu bạn có mảng phụ, Mongoose sẽ tự động tạo id cho từng cái. Thí dụ:

{
    _id: "mainId"
    subDocArray: [
      {
        _id: "unwantedId",
        field: "value"
      },
      {
        _id: "unwantedId",
        field: "value"
      }
    ]
}

Có cách nào để nói với Mongoose không tạo id cho các đối tượng trong một mảng không?

Câu trả lời:


288

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);

2
điều này sẽ bỏ qua _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.
Người dùng web

1
Tôi sử dụng hai cấp của bộ sưu tập lược đồ con lồng nhau. Nói cách khác, tôi có một bộ sưu tập subSchema tương tự như ví dụ của bạn. Trong đó, tôi sử dụng một bộ sưu tập lược đồ con khác. Tôi muốn chỉ các cá thể mô hình lược đồ phụ cấp thứ nhất không sử dụng id, nhưng các thể hiện của mô hình lược đồ phụ cấp hai (lồng nhau) cần phải có id. Khi tôi sử dụng giải pháp của bạn, nghĩa là, chỉ định { _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?
Người dùng web

1
Bạn đã thử, cho cấp độ thứ ba để thiết lập { _id : true }?
throrin19

những gì tôi đã thử ngày hôm qua đã thay đổi điều này: 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: falseid: falsecần thiết.
Người dùng web

Cảm ơn, cách tốt nhất cho tôi.
Swetabja Hazra

128

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


42

Ngoài ra, nếu bạn sử dụng một cú pháp bằng chữ đối tượng để chỉ định một lược đồ phụ, bạn cũng có thể chỉ cần thêm _id: falsevào để thay thế nó.

{
   sub: {
      property1: String,
      property2: String,
      _id: false
   }
}

26

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"
      }
    ]
}

Có cách nào để tạo sự độc đáo trên toàn bộ bộ sưu tập không?
Saitama

Có lẽ không phải với phương pháp này, nhưng bạn luôn có thể thử. _idlà một lĩnh vực chứ không phải là một ràng buộc.
jemiloii

Nếu trong quá trình tạo tài liệu phụ đó, tôi chỉ định rõ ràng _id = mongoose.Types.ObjectId(), liệu đó có phải là duy nhất trên toàn bộ sưu tập không?
Saitama

chỉ cần mở một ngăn xếp ngăn xếp mới, bằng cách này bạn có thể khiến nhiều người trả lời cùng một lúc ~
jemiloii

4

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


1

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.

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.