Mongoose使用其他集合填充空集合

时间:2018-02-19 15:09:26

标签: node.js mongodb express mongoose mongoose-populate

我正在尝试使用预定义的Schema静态方法创建一个填充集合的方法。我希望它从2个不同的集合中获取所有文档并返回它们。对我来说,创建一个单独的Schema并返回this.find().populate()回调似乎是合乎逻辑的,但我无法让它工作......

以下是我的架构:

dht.model.js

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

// Dht Schema from MongoDB
var DhtSchema = mongoose.Schema({
    location: {
        type: String,
        required: true
    },
    reading: {
        type: String,
        required: true
    }
}, {
    timestamps: {
        createdAt: 'created_at',
        updatedAt: 'updated_at'
    },
});

co2.model.js

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

// CO2 Schema from MongoDB
var CO2Schema = mongoose.Schema({
    location: {
        type: String,
        required: true
    },
    reading: {
        type: String,
        required: true
    }
}, {
    timestamps: {
        createdAt: 'created_at',
        updatedAt: 'updated_at'
    },
});

excel.model.js

这是我想要动态填充的模式,因为新数据每20分钟从MQTT中间件添加到数据库中,并且每次调用时都必须返回旧的和新的结果。

var mongoose = require('mongoose'),
Schema = mongoose.Schema;

// Dht Schema from MongoDB
var ExcelSchema = mongoose.Schema({
    co2: [{
        type: Schema.ObjectId,
        ref: 'co2'
    }],
    dht: [{
        type: Schema.ObjectId,
        ref: 'dhts'
    }]
});

ExcelSchema.statics.showAll = function (cb) {
    return this.find().populate('co2 dht').exec(function (err, cb) {
        if (err) {
            return err;
        }
        return cb;
    });
};

module.exports = mongoose.model('merged_sensors', ExcelSchema); 

当在API中调用方法时,它会冻结并返回504.我唯一的假设是,由于某种原因它无法访问集合,但我很可能是错的。

更新

这是一个控制器,它为该集合进行API调用:

excel.controller.js

var Xls = require('./../models/excel.model'),
  express = require("express"),
  router = express.Router();

router.get("/all", function (req, res) {

  Xls.showAll(function (err, results) {
    if (err) throw err;
    res.json(results);
})

});
module.exports = router;

1 个答案:

答案 0 :(得分:0)

更改showAll静态方法以包含回调参数

ExcelSchema.statics.showAll = function (cb) {
    this.find().populate('co2 dht').exec(function (err, results) {
        if (err) {
            return cb(err);
        }
        cb(null, results);
    });
};

将此功能调用为

... .showAll(function (err, results) {
    if (err) throw err;
    console.log(results);
})

如果您想坚持原始签名,那么您必须将结果传递给cb函数,即

ExcelSchema.statics.showAll = function (cb) {
    return this.find().populate('co2 dht').exec(cb);
};

并将此静态调用为

... .showAll(function (err, results) {
    if (err) throw err;
    console.log(results);
})