Node.js Mongoose填充模式返回未定义的

Node.js Mongoose填充模式返回未定义的,node.js,mongoose,population,Node.js,Mongoose,Population,我对用mongoose嵌套一些子文档有点问题。我读了很多这方面的书,几乎什么都试过了 我真的不知道怎么了。 我知道网络上确实有很多关于这个的问题。很多问题都很相似,但没有解决我的问题 问题是,我填充的文档总是空的 我检查了我的模式 我删除了整个数据库 之后,我再次重写了整个模式和代码 没有任何帮助。 我认为这是一个很小的问题,但我不明白 以下是我的模式: probe.js const ProbeShema = new mongoose.Schema({ device: {

我对用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;

输出: 我想说的是: MongoDB文档
我坚信问题的产生是因为循环引用(设备有引用到探针,探针有引用到设备)

在设备模型中,我将删除对设备的引用

js(为了简单起见,我删除了对设备的引用,没有包括其他字段)

device.js(为了简单起见,我没有包括其他字段)

通过这些更改,现在您可以获得具有如下探针的设备:

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
    }
]

这将为您提供如下结果集:

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
    }
]

你可以试试这个-

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 || )})
谢谢你的帮助。 我真的误解了什么。它不时变得更清晰。 我想代码本身并没有错

问题是,人口并没有像我预期的那样起作用。 我必须测试和玩一点来了解更多。 我似乎还不清楚。 我来自MySQL,它的处理方式完全不同

在如何保存不同模型之间的约束等方面,我遇到了很多麻烦。我认为populate只是比较id,然后嵌套它,但事实并非如此。(!?)

它现在似乎起作用了,因为我在数组probs中添加了id

有很多问题要问我,但我必须自己回答。 当你认为自己离目标很近,看到了隧道尽头的光明时,这真的很难,但事实上你刚刚到达隧道^^

谢谢大家,抱歉等了这么久,还有我的英语不好


致以最诚挚的问候

在您的数据库中,探测器阵列为空?抱歉,可能写得不清楚。最后一部分展示了这两个文档。第一个是探头,第二个是装置。所以应该有一个probe,但设备中的probe字段不包含任何内容…:/你的权利。实体不应该列在那里,对吗?!人口通过id引用探测文档自动执行此操作?!换句话说:探测不在数据库的文档“设备”中列出。是。探测字段应该是一个对象id数组,然后填充将工作。如果任何答案对您有帮助,请标记为“答案”或“向上投票”。
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
    }
]

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 || )})