Схема заселения мангуста возвращает неопределенный - PullRequest
0 голосов
/ 30 октября 2019

У меня небольшая проблема с вложением некоторых вложенных документов с помощью mongoose. Я много читал об этом и перепробовал почти все.

Я действительно не знаю, что не так. Я знаю, что в Интернете действительно много вопросов по этому поводу. Многие из них похожи, но моя проблема не решена ничем.

Проблема в том, что мой заполненный документ всегда пуст.

  • Я проверил свои схемы
  • Я удалил всю базу данных
  • После этого я снова переписал все схемы и коды.

Ничего не помогло. Я думаю, что это действительно маленькая проблема, но я не понимаю.

Вот мои схемы:

probe.js

const ProbeShema = new mongoose.Schema({
        device: {
                type: mongoose.Schema.Types.ObjectId,
                ref: 'Device'
        },
        value: {
                type: String,
                required: true,
                enum: ['Energy', 'Consumption', 'Voltage', 'Current', 'Frequency', 'Time', 'Date']
        },
        unit: {
                type: String,
                required: true,
                enum: ['kWh', 'kW', 'V', 'A', 'Hz', 'time', 'date']
        },
        oid: {
                type: String,
                required: true
        },
        measurement: {
                type: mongoose.Schema.Types.ObjectId,
                ref: 'Measurement'
        }
});

const Probe = mongoose.model('Probe', ProbeShema,'probe');
module.exports = Probe;

devices.js

var mongoose = require('mongoose');

const DeviceShema = new mongoose.Schema({
        name: {
                type: String,
                required: true,
                trim: true
        },
        ip: {
                type: String,
                required: true,
                unique: true,
                trim: true
        },
        port: {
                type: String,
                required: true,
                trim: true
        },
        secret: {
                type: String,
                required: true,
                trim: true
        },
        probe: [{
                type: mongoose.Schema.Types.ObjectId,
                ref: 'Probe'
        }]
});

const Device = mongoose.model('Device', DeviceShema,'device');
module.exports = Device;

var express = require('express');
var router = express.Router();
var Device = require('../../models/devices')

Device.find()
   .populate( 'probe')
   .exec()
   .then(devices => {
         console.log(devices)
         res.render('./snmp/snmp', { "title": "SNMP-Devices", "devices": devices });
     })
     .catch(err => {
          console.log(err)
     });

Вывод:

[{
probe: [],
    _id: 5db94f22d8fb641c18fc05b9,
    name: 'test',
    ip: '1.11.1.1',
    port: '111',
    secret:
     '$2b$10$2umat9QqHSFF9/zVih9LU.UKX4sPh/Lmq5XjSai0/pt42QfLXQb6u',
    __v: 0 
}]

Что я ожидаю:


    _id: 5db94f22d8fb641c18fc05b9,
    name: 'test',
    ip: '1.11.1.1',
    port: '111',
    secret:
     '$2b$10$2umat9QqHSFF9/zVih9LU.UKX4sPh/Lmq5XjSai0/pt42QfLXQb6u',
    probe: [
    {
       device: '5db94f22d8fb641c18fc05b9',
       value: 'Energy',
       unit: 'kWh',
       oid:'1.1.1.1.11',
       measurement: 11
    },{
       device: '5db94f22d8fb641c18fc05b9',
       value: 'Consumption',
       unit: 'kW',
       oid:'1.1.1.1.12',
       measurement: 500
     }
]

Документы MongoDB


{
   "_id":"5db95821d3a65d20200cda64",
   "device":"5db9581fd3a65d20200cda63",
   "oid":"asd",
   "value":"Energy",
   "unit":"kWh","__v":0
}


{
   "_id":"5db9581fd3a65d20200cda63",
   "probe":[],
   "name":"asd",
   "ip":"1.1.1.1",
   "port":"1",
   "secret":"$2b$10$mr4x4ls0J2CqdNxnk/ih2.FAHpj1fsXT2NsgrzDXF9y4LCnZBNfXa",
   "__v":0
}

Ответы [ 3 ]

1 голос
/ 30 октября 2019

Я твердо верю, что проблема возникает из-за циклических ссылок (устройство имеет ссылку на зонд, датчик имеет ссылку на устройство)

В модели устройства я бы удалил ссылку на устройство.

probe.js (я удалил ссылку на устройство и не включил другие поля для простоты)

const mongoose = require("mongoose");
const ProbeShema = new mongoose.Schema(
  {
    value: {
      type: String,
      required: true,
      enum: [
        "Energy",
        "Consumption",
        "Voltage",
        "Current",
        "Frequency",
        "Time",
        "Date"
      ]
    }
  }
);


const Probe = mongoose.model("Probe", ProbeShema, "probe");
module.exports = Probe;

device.js (я не включил другие поля для простоты)

var mongoose = require("mongoose");

const DeviceShema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    trim: true
  },
  probe: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Probe"
    }
  ]
});

const Device = mongoose.model("Device", DeviceShema, "device");
module.exports = Device;

С этими изменениями теперь вы можете получить устройства с датчиками, подобными этим:

router.get("/device", async (req, res) => {
  const devices = await Device.find({}).populate("probe");

  res.send(devices);
});

Это даст вам набор результатов, подобный следующему:

[
    {
        "probe": [
            {
                "_id": "5db96a460ef8cc1c9c45e7f4",
                "value": "Energy",
                "__v": 0
            },
            {
                "_id": "5db96aa30ef8cc1c9c45e7f5",
                "value": "Consumption",
                "__v": 0
            }
        ],
        "_id": "5db96f13d8faa752cc9e2cf9",
        "name": "Device 1",
        "__v": 0
    },
    {
        "probe": [
            {
                "_id": "5db96a460ef8cc1c9c45e7f4",
                "value": "Energy",
                "__v": 0
            },
            {
                "_id": "5db96aa30ef8cc1c9c45e7f5",
                "value": "Consumption",
                "__v": 0
            },
            {
                "_id": "5db96f96b59c3139bce431bd",
                "value": "Voltage",
                "__v": 0
            }
        ],
        "_id": "5db96fb1b59c3139bce431be",
        "name": "Device 2",
        "__v": 0
    }
]

0 голосов
/ 01 ноября 2019

спасибо за вашу помощь. Я действительно что-то неправильно понял. Время от времени становится понятнее. Я думаю, что сам код не был неправильным сам по себе.

Проблема была в том, что заполнение не работает так, как я ожидаю. Я должен немного протестировать и поиграть с этим, чтобы узнать больше об этом. Кажется, до сих пор не ясно для меня. Я исходил из MySQL, обработка которого совершенно иная.

У меня много проблем с тем, как сохранить ограничения между различными моделями и так далее. Я думал, что заполнение просто сравнивает идентификатор, а затем вкладывает его, но это не так. (!?)

Кажется, теперь это работает, потому что я добавил идентификаторы в массиве проб.

У меня много вопросов, но я должен ответить на них сам. Это действительно тяжело, когда ты думаешь, что ты так близко к цели и видишь свет в конце туннеля, но на самом деле ты только что прибыл в туннель ^^

Спасибо за все и извините за время ожидания и мой плохойАнглийский.

С уважением

0 голосов
/ 30 октября 2019

Вы можете попробовать это -

Device.aggregate([
// Unwind the source
{ "$unwind": "$devices" },
// Do the lookup matching
{ "$lookup": {
   "from": "probe",
   "localField": "probe",
   "foreignField": "_id",
   "as": "proeObjects"
}},
// Unwind the result arrays ( likely one or none )
{ "$unwind": "$proeObjects" },
// Group back to arrays
{ "$group": {
    "_id": "$_id",
    "devices": { "$push": "$devices" },
    "proeObjects": { "$push": "$proeObjects" }
}}
], (err, result) => { console.log(err || )})
...