查找(查询)返回空表

时间:2019-06-03 08:44:02

标签: node.js mongodb mongoose

第一个查询返回具有匹配值的rigth表。从那些匹配的值中,我想查询其他表以获取所有信息

 var query = { partition : req.params.partition }
    PartitionFilter.find(query)
    .then(partition => {
        if (!partition)
            return res.status(400).send({message : "Partition not found"})
        var query = {
            name : { $in : partition.filter }
        }
        Filter.find(query)
        .then(filter => {
            if (!filter)
                return res.status(400).send({message : "Filter not found "})
            return res.status(200).send(filter)
        })
        .catch(err =>{
            return res.status(500).send(err)
        })
    })
    .catch(err => {
        return res.status(500).send(err)
    })

这是过滤器的模式

'use strict';
var mongoose = require('mongoose');
var Schema = mongoose.Schema;


var filterSchema = new Schema({
    description: {
        type: String,
        required: true,
    },
    name: {
        type: String,
        unique: true,
        required: true,
   },
   duration: {
        type: Number,
        required: true
   }
});

module.exports = mongoose.model('Filter', filterSchema);

'use strict';
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var partitionfilterSchema = new Schema({
  filter: String,
  partition: String
});

module.exports = mongoose.model('PartitionFilter', partitionfilterSchema);

它应该返回所有匹配过滤器的表,但是我得到一个空表

1 个答案:

答案 0 :(得分:0)

好的,我想我知道如何解决您的问题。您的第一个查询返回一个PartitionFilters数组,因此,当您在第二个查询中引用partition.filter时,它是未定义的,因为partition是一个数组(您是否打印了第一个查询的结果和partition.filter的值?)。

您的第二个查询应类似于:

DBGeography

编辑:

尽管这可以解决您的问题,但我认为您可以通过不同的方式改进代码。

  • 当查找查询返回数组时,建议您重命名返回为复数的变量(分区,过滤器...)。

  • 如果您只想获得一个结果,则应该执行一次findOne,但在PartitionFilter的情况下,因为分区未定义为 唯一,同一分区可能会有多个结果 并且只会返回第一个。

  • 如果由于要建立ManyToOne关系而未将其定义为唯一,并且有多个文档将 分区到过滤器,您应该做的是将partition定义为 唯一并作为数组过滤。

  • 在任何情况下,都应按ID关联表(在这种情况下,partitionFilter.filter应该是ID或Filter ID数组)。 例如:

    var query = {
        name: { $in: partition.map(function(elem){ return elem.filter; }) }
    }
    

    您的代码可能类似于:

    var partitionfilterSchema = new Schema({
        partition: {
            type: String,
            unique: true,
            required: true
        },
        filters: [{
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Filter'
        }]
    });