Ich programmiere eine App mit Node.js und MongooseJS als meine Middleware für die Verarbeitung von Datenbankaufrufen.MongooseJS gibt leeres Array nach der Population zurück
Mein Problem ist, dass ich einige verschachtelte Schemas habe und einer von ihnen in einer falschen Weise bevölkert ist. Wenn ich jeden Schritt der Population aufspüre - alle Daten sind in Ordnung, mit Ausnahme des Arrays devices
, das leer ist. Ich überprüfte die Datenbank doppelt und es gibt Daten in diesem Array, also sollte es in Ordnung sein.
Ich habe Room
Schema. Jedes Objekt von Room
hat ein Feld namens DeviceGroups
. Dieses Feld enthält einige Informationen und eine davon ist ein Array namens Devices
, in dem Geräte gespeichert sind, die dem übergeordneten Raum zugewiesen sind.
Wie Sie im Code sehen können, finde ich einen Raum basierend auf seiner ID, die in der Anfrage an den Server kommt. Alles ist gut gefüllt und die Daten stimmen mit den Daten in der Datenbank überein. Problem ist, dass das Array devices
leer ist.
Ist das eine Art von Eigenart von MongooseJS, oder mache ich hier etwas falsch, dass devices
Array leer zurückgegeben wird? Ich habe die Datenbank selbst eingecheckt und es sind einige Daten darin, also sind die Daten in Ordnung, der Fehler ist irgendwo im eingefügten Code.
Der Code:
Schemen:
const roomSchema = Schema({
name: {
type: String,
required: [true, 'Room name not provided']
},
deviceGroups: [{
type: Schema.Types.ObjectId,
ref: 'DeviceGroup'
}]
}, { collection: 'rooms' });
const deviceGroupSchema = Schema({
parentRoomId: {
type: Schema.Types.ObjectId,
ref: 'Room'
},
groupType: {
type: String,
enum: ['LIGHTS', 'BLINDS', 'ALARM_SENSORS', 'WEATHER_SENSORS']
},
devices: [
{
type: Schema.Types.ObjectId,
ref: 'LightBulb'
},
{
type: Schema.Types.ObjectId,
ref: 'Blind'
}
]
}, { collection: 'deviceGroups' });
const lightBulbSchema = Schema({
name: String,
isPoweredOn: Boolean,
currentColor: Number
}, { collection: 'lightBulbs' });
const blindSchema = Schema({
name: String,
goingUp: Boolean,
goingDown: Boolean
}, { collection: 'blinds' });
Datenbank Aufruf:
Room
.findOne({ _id: req.params.roomId })
.populate({
path: 'deviceGroups',
populate: {
path: 'devices'
}
})
.lean()
.exec(function(err, room) {
if (err) {
res.send(err);
} else {
room.deviceGroups.map(function(currentDeviceGroup, index) {
if (currentDeviceGroup.groupType === "BLINDS") {
var blinds = room.deviceGroups[index].devices.map(function(currentBlind) {
return {
_id: currentBlind._id,
name: currentBlind.name,
goingUp: currentBlind.goingUp,
goingDown: currentBlind.goingDown
}
});
res.send(blinds);
}
});
}
})
Ich glaube nicht, dass die Art, wie Sie "Geräte" definiert haben, richtig ist. Eine Möglichkeit, mehrere Schemarefs in einem Array zu haben, ist die Verwendung von [discriminator] (http://mongoosejs.com/docs/api.html#model_Model.discriminator) siehe [Antwort] (https://stackoverflow.com/a/35470271/3284355) – Molda
@Molda könntest du mir ein einfaches Beispiel geben, wie das geht? Natürlich ist 'discriminator' genau das, was ich gesucht habe, aber der andere Post, den Sie verlinkt haben, ist ein bisschen kompliziert wegen der ganzen Middleware, die er benutzt, und es ist nicht sehr klar für mich. Könnten Sie mir ein Beispiel geben, wie ich das in meinem Fall anwenden könnte? Danke –