2013-06-02 5 views
15

İç içe geçmiş nesnelere (ör. Bir nesne dizisi) sahip bir belge oluştururken, her nesneye kendi _id verilir. Örneğin, benim şema şöyle görünür: lists.allocations dizideki her allocation nesnedir gibi belgeler sonunda oluşturulduğundaMongoose, iç içe tüm nesnelere _id ekliyor

mongoose = require "mongoose" 

Schema = mongoose.Schema 

schema = new Schema 
    name: 
    type: String 
    required: true 
    unique: true 
    trim: true 

    lists: [ 
    list: 
     type: Schema.Types.ObjectId 
     required: true 
     ref: "List" 
    allocations: [ 
     allocation: 
     type: Number 
     required: true 
    ] 
    ] 

    createdAt: 
    type: Date 
    default: Date.now 

    updatedAt: 
    type: Date 

# Ensure virtual fields are serialised. 
schema.set "toJSON", 
    virtuals: true 

exports = module.exports = mongoose.model "Portfolio", schema 

lists dizideki her nesne bir _ID verilir. Bu belgeye fazla basmış gibi görünüyor ve belgeyi şişiriyor, ancak MongoDB'nin (veya Mongoose'un) bu ek bilgiyi içerecek bir belgeye ihtiyacı var mı? Değilse, sadece _id'in kök belgede kalmasını önlemek istiyorum.

Ayrıca, Mongoose otomatik olarak id alan kodu beklediğim için gereksinim duyduğum _id için bir id sanal oluşturur. İşte bu yüzden JSON ile sanal olarak döndüm. Ancak, yalnızca kökte değil, yalnızca tüm belgede _id alanları bulunduğundan, bu sanaltüm kopyalarını içerir. Ek _id alanlarını engellemenin bir yolu yoksa, yalnızca sanal dosyayı yalnızca _id kök dosyasına uygulamak için nasıl alabilirim? Ya da onunla yapmaya çalıştığım şeyi yapmanın daha iyi bir yolu varsa, bu ne olurdu? Her iç içe nesne türü için açık şemaları kullanarak ve false onların _id ve id seçenekleri ayarlayarak:

cevap

11

aynı teknikle hem sorunları çözmek için bir yolunu bulmuş. Görünüşe göre, "inline" tanımladığınız nesneleri yerleştirirken Mongoose, sahne arkasındaki nesnelerin her biri için şemalar oluşturur. Bir şema için varsayılan _id: true ve id: true olduğundan, bir _id yanı sıra bir sanal id olsun. Ancak bunu açık bir şema ile geçersiz kılarak, _id oluşturmayı kontrol edebilirim. Daha kod ama istediğimi elde:

mongoose = require "mongoose" 

Schema = mongoose.Schema 

AllocationSchema = new Schema 
    allocation: 
    type: Number 
    required: true 
, 
    _id: false 
    id: false 

mongoose.model "Allocation", AllocationSchema 

ListsSchema = new Schema 
    list: 
    type: Schema.Types.ObjectId 
    required: true 
    ref: "List" 
    allocations: [AllocationSchema] 
, 
    _id: false 
    id: false 

mongoose.model "Lists", ListsSchema 

PortfolioSchema = new Schema 
    name: 
    type: String 
    required: true 
    unique: true 
    trim: true 

    lists: [ListsSchema] 

    createdAt: 
    type: Date 
    default: Date.now 

    updatedAt: 
    type: Date 
+11

(3,6) Ben sadece _ID eklemek mümkün olduğum için kod ekleme: false alt şemalara ana şemada ayrı alt şemalar yapmanıza gerek kalmadan sağ alt şemalar – cyberwombat

+1

Bir JavaScript çözümü arıyorsanız: http://stackoverflow.com/questions/17254008/stop-mongoose-from-created-ids-for- subdocument-arrays –

2

@neverfox sayesinde bilgi için, sadece Nodejs

versiyonda
var _incidents = mongoose.Schema({ 
    name : {type : String}, 
    timestamp: {type : Number}, 
    _id : {id:false} 
}); 


_schema = mongoose.Schema({ 
    _id: {type: String, required: true}, 
    user_id: {type: String, required: true}, 
    start_time: {type: Number, required: true}, 
    incidents : [_incidents], 
}); 
+0

FYI Alt belgelerdeki _id değeri için {id: false} yerine yalnızca false kullanabildim –