Mungo Füllen Sie die Rückgabe von null oder undefiniert
Tut mir Leid, wenn dies eine n00b-Frage, ich habe Google-Suche & Stack für Stunden jetzt, und ich habe zu Fragen!
Habe ich zwei Schemata, Benutzer und Geschichte, siehe unten. Ich bin versucht, eine Referenz für Anwender, die eine Geschichte mit der Ref-option zum Auffüllen in der Abfrage habe ich mit Hilfe von mySQL vor und wollte so versuchen, Sie zu replizieren, die eine JOIN-Anweisung.
Immer wenn ich versuche zu verwenden, Auffüllen, bekomme ich nur die objectID zurückgegeben, oder null (siehe unten).
Bearbeitet 12 Nov-fix-IDs hardcoded & add-Konsole Daten
story-schema.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
User = require('./user-schema');
var StorySchema = new Schema({
title: { type: String, required: true },
author_id: { type: Schema.Types.ObjectId, ref: 'User' },
summary: { type: String, required: true },
rating: { type: String, required: true }
});
module.exports = mongoose.model('Story', StorySchema, 'stories');
user-schema.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var UserSchema = new Schema({
username: { type: String, required: true, index: { unique: true } },
is_admin: {type: Boolean, required: true, default: false }
});
speichern - id hardcoded zum Beispiel
app.post('/api/new_story', function(req, res){
var story;
story = new Story({
title: req.body.title,
author_id: mongoose.Types.ObjectId(req.params._id),
/* ex of req.params._id: 527fc8ff241cdb8c09000003*/
summary: req.body.summary,
rating: req.body.rating
});
story.save(function(err) {
if (!err) {
return console.log("created");
} else {
return console.log(err);
}
});
return res.send(story);
});
Beispiel Benutzer wenn Sie angemeldet terminal
{
"__v" : 0,
"_id" : ObjectId("527fc8ff241cdb8c09000003"),
"is_admin" : false,
"username" : "ted"
}
Beispiel-Geschichte, wenn Sie eingeloggt terminal
{
"title" : "Test Story",
"author_id" : "527fc8ff241cdb8c09000003",
"summary" : "Test summary",
"rating" : "12",
"_id" : ObjectId("52827692496c16070b000002"),
"__v" : 0
}
Abfragen
//other mongoose/app includes above
User = require('./config/schema/user-model'),
Story = require('./config/schema/story-model');
//data.author_id = 527fc8ff241cdb8c09000003
//data.author_id.username = undefined
app.get('/api/query/:id', function (req, res){
return Story.findOne({_id:req.params.id})
.populate( { path: 'User' } )
.exec(function (err, data) {
console.log(data.author_id);
console.log(data.author_id.username);
if (err) {
return res.json({error:err})
}
})
});
//data.author_id = null
app.get('/api/query2/:id', function (req, res){
return Story.findOne({_id:req.params.id}) //_id hardcoded for example
.populate( 'author_id' )
.exec(function (err, data) {
console.log(data.author_id);
if (err) {
return res.json({error:err})
}
})
});
In der ersten Abfrage bekomme ich die author_id ich schon gespeichert, welche Art von Sinn macht, wie das ist, was ich gerettet - aber ich habe Zugriff auf den Benutzernamen.
In der zweiten Abfrage kann ich nicht einmal Zugriff auf die author_id hab ich schon gespeichert.
Edit: ich einen normalen GET-Abfrage gut ohne das 'Auffüllen'
, Was ich gerne sehen würde
Ist in der Lage sein, um den Zugriff auf die Autor-Informationen aus der Geschichte - das ist mehr so ein proof of concept.
Schließlich möchte ich Referenz die Geschichte _id in der die Benutzer-Modell, da es viele Geschichten, die eine Benutzer -, sondern nur ein Benutzer pro Geschichte, aber dachte, ich würde hier als erstes.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Ihr Beispiel umfasst die raw-Objekt-IDs nicht einmal zitiert gültigen javascript-strings, es ist schwer zu verstehen, was ein Fehler in Ihrer Frage vs einen Fehler in Ihrem code, sondern meist Ihre zweite Abfrage sieht wie es funktionieren sollte. Ich vermute, Sie sind die Vermischung der ObjectId-Werte. Sie sind mit der gleichen ObjectId für Ihre Geschichte und die Ihrer Benutzer-und das wird nicht funktionieren:
Dass ' s die gleiche ID, die Sie verwenden, um die lookup-Geschichte. Also ich denke, der fix ist:
Wenn Sie immer noch nicht arbeiten, code die ganze Sache in einem einzigen
.js
- Datei mit den beiden Schemata, die beide Modelle, und einige code zum erstellen der Datensätze, dann die Abfragen und buchen, die./api/query2/:id
etc - ich denke, es muss etwas zu tun mit dem separaten Dateien erforderlich, dass in jeder anderen - ich fand diese Antwort link aber das hat bei mir nicht funktioniert entweder, wenn man Sie wieder. So jetzt, 1 Datei es ist!require
Referenz jedes Modell in jeder anderen, verwenden Sie einfach den string den Namen des Modells in das schema refs.Ich steckte mit diesem problem seit einer Woche. Nachdem alles versucht und dafür sorgen, dass ich hatte keine zirkulären Referenzen entschied ich mich zum zurücksetzen meiner DB.
Nach dem entfernen aller Sammlungen, und speichern Sie Sie wieder, alle meine Beziehungen verwaltet von Mungo ' s
populate()
gearbeitet.Es ist so frustrierend, denn dieses Problem ist nicht dokumentiert, und ich verlor die 20-30 Stunden, die versuchen, zu dumm Sammlung Nachschlagewerk.
Ist es möglich, dass Sie vergessen haben, einen "ref" - Feld in Ihr Schema?
Ich habe gerade stieß dieses Problem und nach der Zugabe von ein ref-Feld, um mein Schema funktioniert es sofort ohne die Notwendigkeit, um die Datenbank zurückzusetzen. Hoffe, diese information hilft.
Fand ich ein Beispiel hier dokumentiert: https://mongoosejs.com/docs/3.0.x/docs/populate.html. Obwohl es ist eine Dokumentation für version 3.0.x, ich fand es hilfreich, auch für die version 5.5.5 die ich jetzt verwende.
Ich stolperte über dieses und das problem war das verweisen auf ein Dokument gelöscht. reset deine DB, ob Sie oder überprüfen Sie die referenzierte id