2016-05-20 10 views
0

Ok, also ich habe diese Funktion, um einen Blog Post mit einer ID aus einem Mongodb db zu bekommen.Ich kann nicht verstehen, Mongoose "findOne"

exports.blogPostFirst = function(req, res, next) { 

    BlogPost.findOne({  
     _id: '1' 
    }, function(err, e) { 
     if (err) { 
      return next(err); 
     } else { 
      req.content = e; 
      next(); 
     } 
    }); 

    res.render('blogPage', { 
     title: req.content.title, 
     content: req.content.html_content 
    }) 
}; 

Jetzt für, irgendeinen Grund des _id : '1' Teil ein String nicht funktioniert, ist das _id Feld.

Wenn ich stattdessen gebe dem _id Parameter einen Wert in der Form von einem Elemente eine Route zum Beispiel bilden die ich in meiner Route ‚Route :: param‘ habe

und ich gebe die Funktion über ein viertes Argument ‚id‘ und übergeben Sie es als ein "param" -Parameter funktioniert es gut, aber ich bin nicht sicher, wie kann ich das Feld "_id" manuell festlegen.

Die BlogPost Objekte ist wie folgt:

var BlogPost = require('mongoose').model('Post'); 

der Mungo Schema ist:

Schema = mongoose.Schema; 

var PostSchema = new Schema({ 
    title: String, 
    html_content: String, 
    _id: String, 
}); 

mongoose.model('Post', PostSchema); 

Antwort

0

Die _id in MongoDB kein String ist, ist es ein ObjectId ist, die von 12-Bytes besteht (24 Zeichen). Sie sollten so etwas wie verwenden:

_id: ObjectId("573ee9d4ae07fbe5b79bd0d0") 

können Sie auch:

Model.findById(id, function (err, doc){ 
}); 

wo id ein String

https://docs.mongodb.com/v3.0/reference/bson-types/#objectid

+0

Ich bin mir nicht sicher, ob Sie falsch liegen oder nicht, aber das ist nicht das Problem, um sicher zu sein. Wenn ich das Schema ändern in: var PostSchema = new Schema ({ title: String, html_content: String, Nummer: String, urlOne: String, urlTwo: String, urlThr: String, }); Aka ließ mongodb die _id autoset und stattdessen eine "falsche ID", durch die ich suche die Nummer namens "Nummer" und ändern Sie meinen Code zu Nummer: '1' ........ Das Ergebnis ist immer noch das gleiche, die dB gibt kein signifikantes Objekt zurück –

+0

Das sollte funktionieren. Versuchen Sie die Funktion 'findById' zu verwenden. Überprüfen Sie auch in der MongoDB-Shell, dass das, was Sie abfragen möchten, in der Datenbank vom selben Typ ist. – ana06

0

Ok über MongoDB-IDs für weitere Informationen sein können, so Nachdem ich für einen Bruchteil einer Sekunde klar darüber nachgedacht hatte, sah ich mein Problem. Wenn ich schreibe:

BlogPost.findOne({  
    _id: '1' 
}, function(err, e) { 
    if (err) { 
     return next(err); 
    } else { 
     req.content = e; 
     next(); 
    } 
}); 

habe ich den .content Parameter des Antrags o gleich „e“ (das Ergebnis meiner findOne Abfrage), aber nach der findOne Funktion „fertig“ ist req.content doesn ‚t halten es Wert, req.content vielmehr existiert nur in der Umgebung dieser Funktion, so sollte ich die Funktion wie folgt nennen:

exports.blogPostFirst = function(req, res, next) { 

    BlogPost.findOne({  
     _id: '1' 
    }, function(err, e) { 
     if (err) { 
      return next(err); 
     } else { 
      req.content = e; 
      next(); 
       res.render('blogPage', { 
     title: req.content.title, 
     content: req.content.html_content 
    }) 
     } 
    }); 
}; 

Was mich verblüfft ist, warum das überhaupt funktioniert hat, wenn ich verwendet habe, es mit Parametern von der URL übergeben ... oder vielleicht habe ich die Lösung gefunden, aber meine Argumentation für die fi x ist schlecht. Wie auch immer, ich habe meine Antwort, aber ich kann das nicht löschen, also werde ich es einfach hier lassen

Verwandte Themen