2016-07-18 12 views
0
var UserSchema = new Schema({ 
    job : [{ 
    type : mongoose.Schema.Types.ObjectId, 
    experience : String, 
    grade : String, 
    ref: 'Company'}] 
}); 

Benutzer kann mehrere Jobs haben. Wenn ich einen Auftrag an den Benutzer hinzuzufügen, ich tun, wie folgt:Referenzieren eines anderen Schemas in Mungo mit zusätzlichen Feldern

Wenn ich habe:

req.body.job == {type : company._id, experience : "bla bla", grade : "smth"} 

und

function addJob(req, res, next) { 

    var userId = req.user._id; 
    var job = req.body.job; 
    return User.findById(userId).exec() 
    .then(user => { 
     user.job.push(job); 
     return user.save() 
     .then(handleEntityNotFound(res)) 
     .then(respondWithResult(res)) 
     .catch(handleError(res)); 
    }); 
} 

ich einen Fehler bekam:

Unhandled rejection CastError: Cast to ObjectId failed for value "[object Object]" at path "job" 

Aber wenn ich das tue:

req.body.job == {type : company._id, experience : "bla bla", grade : "smth"} 

mit

function addJob(req, res, next) { 

     var userId = req.user._id; 
     var job = req.body.job; 
     return User.findById(userId).exec() 
     .then(user => { 
      user.job.push(job.type); // <---------- 
      return user.save() 
      .then(handleEntityNotFound(res)) 
      .then(respondWithResult(res)) 
      .catch(handleError(res)); 
     }); 
    } 

Es funktioniert aber experience und grade sind nicht definiert. Wie kann ich diese Felder angeben?


EDIT:

Also änderte ich UserSchema wie:

var UserSchema = new Schema({ 
    job : [{ 
    _company : { 
     type : mongoose.Schema.Types.ObjectId, 
     ref: 'Company' 
    }, 
    experience : String, 
    grade : String 
    }] 
}); 

Und ich versuchte:

//req.body.job == {_company:{type : company._id}, experience : "bla bla", grade : "smth"} 

function addJob(req, res, next) { 

    var userId = req.user._id; 
    var job = req.body.job; 
    return User.findById(userId).exec() 
    .then(user => { 
     user.job.push(job); 
     return user.save() 
     .then(handleEntityNotFound(res)) 
     .then(respondWithResult(res)) 
     .catch(handleError(res)); 
    }); 
} 

Ich habe eine 500 (Internal Server Error) Fehler om Server

ABER

//req.body.job == {_company:{type : company._id}, experience : "bla bla", grade : "smth"} 

function addJob(req, res, next) { 

    var userId = req.user._id; 
    var job = req.body.job; 
    return User.findById(userId).exec() 
    .then(user => { 
     user.job.push(job._company); //<----------------- 
     return user.save() 
     .then(handleEntityNotFound(res)) 
     .then(respondWithResult(res)) 
     .catch(handleError(res)); 
    }); 
} 

Arbeiten ohne Fehler. Allerdings gibt es immer noch nichts über grade und experience Feld in mongodb ...

Antwort

1

Das Feld „Typ“ von Mungo reserviert ist, dann

{ 
    type : mongoose.Schema.Types.ObjectId, 
    experience : String, 
    grade : String, 
    ref: 'Company' 
} 

ist ein Unternehmen mit einer Art von ObjectId beschreibt, verweist ein Unternehmen (Dieser wird mit .populate verwendet). Leider werden die anderen Felder ignoriert, da sie in MongoDB als ObjectId gespeichert werden.

Sie können dann wählen, das Unternehmen in eines der Felder zu verweisen, und in der Lage, die zusätzlichen Bits von Informationen mit einem JobSchema wie abzurufen:

{ 
    _company : {type: mongoose.Schema.Types.ObjectId, ref: 'Company'} 
    experience : String, 
    grade : String 
} 

Sie das _Unternehmen Feld zu füllen in der Lage von Ihre Arbeitsplätze, ohne die „Erfahrung“ und „Note“ Informationen


Nach Ihrer Ausgabe zu verlieren:

Mit dem gegebenen JobSchema:

{ 
    _company : {type: mongoose.Schema.Types.ObjectId, ref: 'Company'} 
    experience : String, 
    grade : String 
} 

Ihre Jobinstanz sollte wie folgt aussehen {_Unternehmen: ObjectId ("......."), Erfahrung: "blabla", Note: "smth"}. Dann sollte Ihr req.body.job {_company: company._id, Erfahrung: "bla bla", Grad: "smth"}

In Ihrem ersten addJob haben Sie einen Fehler 500, weil Sie MongoDB bitten zu wirken ein Dokument, das wie {type: ObjectId ("....")} in eine ObjectId aussieht.

Der zweite addJob löst keinen Fehler aus, weil Sie ein Dokument hochladen, das wie {type: ObjectId ("...")} aussieht (und dabei die Felder "grade" und "experience" verliert) Schema-Felder sind erforderlich, damit Mungo Ihren Feldtyp ignoriert und ein leeres Objekt in Ihre Sammlung hochlädt.

tl; dr: Es sollte sein:

// req.body.job == {_company: company._id, experience : "bla bla", grade : "smth"} 

function addJob(req, res, next) { 
    var userId = req.user._id, 
     job = req.body.job; 

    return User.findById(userId) 
       .exec() 
       .then(
        user => { 
         user.job.push(job); 
         return user.save() 
            .then(handleEntityNotFound(res)) 
            .then(respondWithResult(res)) 
            .catch(handleError(res)); 
        } 
       ); 
} 
+0

Ja ich so etwas wie dies dachte. Also ich denke, es gibt keine andere Lösung, oder? – Emidomh

+0

@Emidomh Ich glaube nicht, dass es eine andere Lösung gibt, sorry:/ – GnsBeldaran

+0

Ich bearbeitet meinen Beitrag, bitte werfen Sie einen Blick :) – Emidomh

Verwandte Themen