2017-04-02 4 views
0

ich ein verschachteltes Dokument, das wie folgt aussieht:

var User = new Schema({ 
    id: String, 
    position: [{ 
     title: String, 
      applied:[{ 
       candidate_id: String, 
       name: String 
     }], 
     }], 

Was ich suche ist alle des ‚angewandte‘ Subdokumente zu tun zurück, die ein gewissen passen ‚candidate_id‘

Was ich habe, so weit:

app.get('/applied', function(req, res){ 

    var position = "58dc2bd4e7208a3ea143959e"; 

    User.aggregate(
     {$unwind : "$position"}, 
     {$unwind : "$position.applied"}, 
     {$match:{'position.applied.candidate_id': position}}).exec(function (err, result) { 
      console.log(result); 
     }); 
     res.render('applied', { title: 'applied',layout:'candidate'}); 
}); 

ich habe eine andere Funktion, die alle Positionen zurückgibt, die übereinstimmen, und dass Code funktioniert:

app.post('/search', function (req, res) { 

    var position = new RegExp(req.body.position, 'i'); 
    var location = new RegExp(req.body.location, 'i'); 

    User.aggregate(
     {$unwind : "$position"}, 
     {$match:{'position.title': position,'position.location':location}}).exec(function (err, result) { 
     console.log(result); 
     res.send({ results: result }); 
    }); 
}); 

Also im Grunde kämpfe ich mit einem Sub-Sub-Dokument zu bekommen. Irgendeine Idee, wo ich falsch liege?

Beispieldaten:

{ 
"_id" : ObjectId("58c2871414cd3d209abf5fc9"), 
"position" : [ 
    { 
     "_id" : ObjectId("58d6b7e11e793c9a506ffe8f"), 
     "title" : "Software Engineer", 

     "applied" : [ 
      { 
       "candidate_id" : "58d153e97e3317291gd80087", 
       "name" : "Sample user" 

      }, 
      { 
       "candidate_id" : "58d153e97e3317291fd99001", 
       "name" : "Sample User2" 

      } 
     ] 
    }, 
    { 
     "_id" : ObjectId("58c2871414cd3d209abf5fc0"), 
     "title" : "Software Engineer", 

    } 
], 

}

Was oben vor sich geht ist es zwei Positionen, von denen einer (erster Eintrag) hat zwei Kandidaten angewendet, was ich tun müssen, ist die verschachtelte Rück Objekt, wenn es mit der Mungo-Abfrage übereinstimmt.

+0

Was passiert? Haben Sie auch einige Beispieldaten, für die das nicht richtig funktioniert? –

+0

@ExplosionPills Das Array wird leer zurück .. Ich werde die Frage aktualisieren, um einige Beispieldaten anzuzeigen! – user

Antwort

1

Ihr Code scheint gut zu mir Ich habe umgesetzt gleiche und es funktioniert bei mir nur möglich Problem kann sein, dass Ihre Position = „58dc2bd4e7208a3ea143959e“ es könnte es als String sprechen nur wandeln es in objectId mithilfe der folgenden Code und überprüfen Sie es sollte für Sie arbeiten.

var mongoose = require('mongoose'); 

    var position = mongoose.Types.ObjectId("58dc2bd4e7208a3ea143959e"); 

      User.aggregate(
       {$unwind : "$position"}, 
       {$unwind : "$position.applied"}, 
       {$match:{'position.applied.candidate_id': position}}).exec(function (err, result) { 
        console.log(result); 
       }); 
       res.render('applied', { title: 'applied',layout:'candidate'}); 
     }); 
+0

Ich habe gerade festgestellt, dass das Feld candidate_id in meiner Datenbank nur die Zahl selbst ohne die 'ObjectId' davor ist, also kann ich jetzt die Daten ziehen, aber nur das Positions-Array wird abgewickelt? Das angewendete Array wird mir in der Konsole als "applied: [Object]" zurückgegeben .. und es gibt nur den gesamten Benutzer zurück :( – user

+0

Ja, Sie erhalten alle Daten, aber jetzt wird Ihr angewendetes Array ein Objekt sein, das nur habe das Ergebnis des Benutzers, dessen Bedingung mit deiner gegebenen Bedingung übereinstimmt, wie wenn deine Position = "58d153e97e3317291gd80087" in deinem Ergebnis ist, kannst du darauf durch result [0] .position [0] .applied.name zugreifen und es wäre gleich "Sample Benutzer "(in Anbetracht Ihres Beispiels) –

+0

Vielen Dank @Shumi Gupta, Sie haben mir wirklich geholfen !! Seine Arbeit jetzt! :) – user

Verwandte Themen