Mongoose:使用$ in查询文档的嵌套属性

时间:2017-03-29 04:18:35

标签: node.js mongodb mongoose mongodb-indexes

所以我尝试使用Mongoose的$in查询以下文档。

var Reports = [
    {
        "employee" : {
            "gender" : {
                "id": 0,
                "name" : "Male"
            },
            "race" : {
                "id": 1,
                "name" : "White"
            }
        },
        "date" : "2016-12-21T01:03:00.000Z",
        "type": {
                "id": 0,
                "name" : "Business"
         }
    },
    {
        "employee" : {
            "gender" : {
                "id": 1,
                "name" : "Female"
            },
            "race" : {
                "id": 1,
                "name" : "White"
            }
        },
        "date" : "2016-11-02T12:55:00.000Z",
        "type": {
                "id": 1,
                "name" : "Human Resources"
         },
    }
]  

用于查询数据库的API路径

// Load Necessary modules
var mongoose = require('mongoose');
var Report = require("../models/report");

// HTTP POST '/api/query'
router.post('/query', function(req, res, next) {
    var type         = req.body.type;
    var startDate    = req.body.startDate;
    var endDate      = req.body.endDate;
    var gender       = req.body.gender;
    var race         = req.body.race;

    var query = Report.find({});

    if (type){
        query = query.where('type.name').equals(type)
    }
    if (startDate && endDate) {
        query = query
        .where('date')
        .gte(new Date(startDate))
        .lte(new Date(endDate))
    }
    if (gender) {
        // query = query.where('employee.gender.name').in(gender)
        query = query.find({'employee.gender.name': {'$in': gender}})
    }
    if (race) {
        // query = query.where('employee.race.name').in(race)
        query = query.find({'employee.race.name': {'$in': race}})
    }

    query
    .limit(10)
    .exec(function(err,reports){
        if(err)
            return res.send(err);
        res.json(reports)
    })
})  

我应该指出,性别种族是用户在正文中发送的字符串数组(gender = ['Male','Female','Transgender']race = ['White','Black'])请求。

在员工财产上设置索引。

db.reports.ensureIndex({employee : 1})  

这是为了确保查询更有效,更快速。我甚至创建了额外的索引来查看我是否可以使查询工作

db.reports.ensureIndex({employee.gender : 1})
db.reports.ensureIndex({employee.gender.name : 1})  

没有运气......

Mongo Shell

当我在Mongo Shell下面运行此查询时,它似乎可以正常工作,但是当我尝试使用像POSTMAN这样的工具时它不会或我尝试使用AngularJS从前端发送请求

> db.reports.find({'suspect.gender.name': {'$in': ['Male']}}).count()
2

在我的前端代码中,我确保我的标头设置为"Content-Type": "application/x-www-form-urlencoded;charset=utf-8"

请帮忙。我在这里做错了什么?

0 个答案:

没有答案