搜索nodejs和mongodb中的查询以及填充的数据

时间:2017-09-05 13:02:58

标签: node.js mongodb mongoose

我有一个用nodejs和mongodb编写的网络应用程序,我有以下两个模型

   var TeacherSchema = new Schema({
       school_id:[{type: Schema.Types.ObjectId, ref: 'School'}],
       name: String,
       subjects: [{type: Schema.Types.ObjectId, ref: 'Subject'}],
       });


 var SubjectSchema = new Schema({
     title : String,
     school_id:[{type: Schema.Types.ObjectId, ref: 'School'}]
     });

我写了一个api,搜索扔老师或科目

 router.get("/field-teacher-subject", function (req, res) {
var   school_id= req.query.schoolId;
Subject.find(school_id:'school_id,function (err, subjects) {
    if (err) {
        console.log(err);
        res.json({status: "error", message: err.message});
    } else {
        var sub_array=[];
        for(var q in subjects){
            sub_array.push(subjects[q]._id);
        }
        Teacher.find({subjects:{$in :sub_array }},{first_name:true, father_name:true, last_name : true, subjects:true}).populate('subjects')
            .exec(function(tech) {
                console.log("hello: ");
                var subjeto = [];
                if(tech){
                    for(var p in tech){
                        subjeto.push(tech[p].subjects);
                    }
                }
                res.json({status: "success", message: "subjects returned", 
            items: tech});
            }).catch(function(err){
                if(err){
                    res.json({status:"error",
                      message:"error occurred"+err.message});
                    return;
                }
            });
    }
}).limit(parseInt(req.query.max));
});

当我搜索名字时,此返回为空, 什么是解决这个问题的最佳方法

1 个答案:

答案 0 :(得分:1)

很难知道你在问什么,但你的代码几乎没有错误。让我们清理你的代码,好吗?

QueryBuilder prodBuilder = ...;

SearchResponse scrollResp = client.
        prepareSearch("prods")
        .setScroll(new TimeValue(60000))
        .setSize(1000)
        .setTypes("prod")
        .setQuery(prodBuilder)
        .execute().actionGet();

ObjectMapper mapper = new ObjectMapper();
List<TestDto> products = new ArrayList<>();

try {
    do {
        for (SearchHit hit : scrollResp.getHits().getHits()) {
            products.add(mapper.readValue(hit.getSourceAsString(), TestDto.class));
        }
        LOG.info("Next page with 1000 elem: " + products);
        products.clear();
        scrollResp = client.prepareSearchScroll(scrollResp.getScrollId())
                .setScroll(new TimeValue(60000))
                .execute()
                .actionGet();
    } while (scrollResp.getHits().getHits().length != 0);
} catch (IOException e) {
    LOG.error("Exception while executing query {}", e);
}

有用的链接:

  • 请参阅doc中有关如何使用router.get("/field-teacher-subject", function (req, res) { // get subjects Subject .find({ school_id: req.query.schoolId }) // 1st argument is an object .limit(parseInt(req.query.max)) // should go before .exec(function (err, subjects) { // use .exec() if (err) { console.log(err); return res.json({ status: "error", message: err.message }); } // get subject IDs var sub_array = subjects.map(function (subject) { return subject._id; }); // get teachers assigned to subjects Teacher .find({ subjects: { $in: sub_array }}) .select('first_name father_name last_name subjects') .populate('subjects') .exec(function(err, teachers) { // 1st argument is an error if (err) { console.log(err); return res.json({status: "error", message: err.message }); } var subjeto = teachers.map(function (teacher) { return teacher.subjects; }); res.json({status: "success", message: "subjects returned", items: teachers }); }); }); }); .limit()的第3个示例。

  • .map()

  • 您尝试在第二个查询中使用.exec() .exec().then()