2016-07-15 11 views
0

Gegeben:node.js - bevölkern eingebettetes Dokument in Mongoose

var productSchema = new Schema({ 
    name: String, 
    details : [{ name: String, description: String }] 
}) 


var listSchema = new Schema({ 
    name: String, 
    products: [{ 
    product_id: { type: Schema.Types.ObjectId, ref: 'Product' }, 
    product_vid: { type: Schema.Types.ObjectId, ref: 'Product.details' } 
    }] 
}) 

Wie kann ich die Abfrage für die Liste zu tun mit nur product_id mit einer Detail passenden product_vid darin entsprechenden?

List.findById(list_id) 
    .populate({ 
     path: 'products.product_id', 
     populate: { 
     path: 'products.product_vid' 
     } 
    }) 
    .exec(function(err, doc){ 
     ...... 
} 

Antwort

0

Das ist falsch

product_vid: { type: Schema.Types.ObjectId, ref: 'Product.details' } 

Detailfeld eines Modells ist. und nicht selbst modellieren.

sollte es so etwas wie ..

var listSchema = new Schema({ 
    name: String, 
    products: [{ type: Schema.Types.ObjectId, ref: 'Product' }], 
}) 

und dann

populate('products') 

oder wahrscheinlich

populate('products products.details') 

Versuchen Sie einfach und lassen Sie mich wissen.

+0

es funktioniert nicht ... ich habe es schon einmal versucht. Es zeigt einen Fehler an, der besagt: "Schema wurde nicht für Modellprodukt registriert." – tellingeric

+0

Meinten Sie product.detail oder products.product_id? ah ok .. ich schätze das ist falsch. product_vid: {type: Schema.Types.ObjectId, ref: 'Product.details'} – enRaiser

+0

aber wie bekomme ich dann die richtige Version der Details? Ich möchte nur das richtige Produkt mit den richtigen Details bekommen. (Deshalb habe ich ein product_vid in das Produkt-Array in List gesetzt) ​​ – tellingeric

3

Es besteht keine Notwendigkeit für

product_vid: { 
type: Schema.Types.ObjectId, ref: 'Product.details'} 

in listSchema.

var productSchema = new Schema({ 
name: String, 
details : [{ name: String, description: String }] 
    }) 


var listSchema = new Schema({ 
    name: String, 
    products: [{ type: Schema.Types.ObjectId, ref: 'Product' }]) 

     List.findById(list_id) 
     .populate({ 
       path: 'products', 
       match: { details: "your matching value"}) 
      .exec(function(err, doc){ 
        ...... 
     } 
+0

Wenn ich das product_vid lösche, wie kann ich dann die Produkte mit den entsprechenden Details füllen? Wie der Match-Wert ist die _id im Detail und ich muss einen Weg finden, um es irgendwo in der Liste zu speichern? – tellingeric

+0

erhalten Sie das gesamte Array zurück, nicht nur das Array-Element, das die Übereinstimmung verursacht hat. –

Verwandte Themen