如何使用mongoose从节点js中的集合中获取数据

时间:2017-05-03 09:24:50

标签: javascript node.js mongodb mongoose

我的mongodb中有6个不同的集合,5个集合连接到一个连接,但我没有使用ref,而我做的是我获得5个集合的Id然后将其保存到第6集是" List"所以我仍然有一个共同的领域,我可以用作参考

这是我的收藏结构

list Collection
   var ListDoc = new mongoose.Schema({
       type_id        : {type: Schema.Types.ObjectId, required: true},
       detail_id      : {type: Schema.Types.ObjectId, required: true},
       address_id     : {type: Schema.Types.ObjectId, required: true},
       inquiries_id   : {type: Schema.Types.ObjectId, required: true},
       account_id     : {type: Schema.Types.ObjectId, required: true}
    });
    module.exports = mongoose.model('List', ListDoc);

Account Collection
    var accountDoc = new mongoose.Schema({
        email     : {type: String, unique: true, required: true},
        password  : {type: String, required: true}
    });
    module.exports = mongoose.model('Accounts', accountDoc );

Type Collection
    var TypeDoc = new mongoose.Schema({
        type   : {type: String, required: true},
        class  : {type: String, required: true},
    });
    module.exports = mongoose.model('Type', TypeDoc);

Detail Collection
    var DetailDoc = new mongoose.Schema({
        bedr         : {type: Number, required: true},
        diningr      : {type: Number, required: true},
        livingr      : {type: Number, required: true},
        kitchenr     : {type: Number, required: true}
        bathr        : {type: Number, required: true}
    });
    module.exports = mongoose.model('Detail', DetailDoc);

Address Collection
    var AddressDoc = new mongoose.Schema({
        city     : {type: String, required: true},
        brgy     : {type: String, required: true},
        street   : {type: String, required: true},
        bldgno   : {type: String, required: true},
        floorno  : {type: String, required: true},
        roomno   : {type: String, required: true}
    });
    module.exports = mongoose.model('Address', AddressDoc);

 Inquiries Collection
    var InquiriesDoc = new mongoose.Schema({
        inquiries    : {type: Number, required: true},
        views        : {type: Number, required: true},
    });
    module.exports = mongoose.model('Inquiries', InquiriesDoc);

注意:每个集合都有不同的.js文件

列表集合的ID为4另一个集合。

这就是我想要实现的目标

[ {
   "_id": "5907747e424c860f7495ad46",
   "account_id": "5908f3381cd9810ea8e2b517",
   "type": {
       "type" : "apartment",
       "class" : "middle"
      },
   "detail": {
       "bedr": 4,
       "diningr": 2,
       "livingr": 1,
       "kitchenr": 1,
       "bathr": 4
    },
   "address": {
       "city" : "lucena",
       "brgy" : "8",
       "street" : "rose",
       "bldgno" : "24",
       "floorno": "2",
       "roomno": "205"  
     },
  "inquiries": {
       "views" : 0,
       "inquires" : 0
      }
  },
  {
   "_id": "5907747e424c860f7495ad47",
   "account_id": "5908f3381cd9810ea8e2b517",
   "type_id": {
       "type" : "apartment",
       "class" : "middle"
             },
   "detail": {
       "bedr": 4,
       "diningr": 2,
       "livingr": 1,
       "kitchenr": 1,
       "bathr": 4
    },
   "address": {
       "city" : "lucena",
       "brgy" : "8",
       "street" : "rose",
       "bldgno" : "24",
       "floorno": "3",
       "roomno": "307"  
     },
   "inquiries": {
       "views" : 0,
       "inquires" : 0
       }
   }, ]

首先,我获取列表集合中的所有数据,即4集合的Ids,然后我尝试循环它以便我可以从其他集合中获取另一个数据

for(var loop =0 ; loop < list.length; loop++){
        var pt_id = list[loop].type_id;
        var pa_id = list[loop].address_id;
        var pd_id = list[loop].detail_id;
        var pi_id = list[loop].inquiries_id;
 }

我在for循环中使用async然后将其连接到&#34; testresult&#34; var使用+=

这是我的代码

var PL = require('../models/list');
var PT = require('../models/type');
var PA = require('../models/address');
var PD = require('../models/detail');
var PI = require('../models/inquiry');
var cryption    = require('../services/encrypt_decrypt');
var crypt = new cryption();
var async = require('async');


module.exports.read = function (request, response) {
var decryptedId = crypt.decrypt(request.decode.id);


var propertylistquery = PL.find({}).where('account_id').equals(decryptedId).select({"_id":0,"__v":0});

propertylistquery.exec(function (error, list) {
    if (error) {
        return response.status(500).send({success: false, error: error, message: 'Something went wrong.'});
    }
    if (!list) {
        return response.status(200).send({success: false, message: 'User not found in the database.'});
    }

    var testresult;
    for(var loop =0 ; loop < list.length; loop++){
        var pt_id = list[loop].type_id;
        var pa_id = list[loop].address_id;
        var pd_id = list[loop].detail_id;
        var pi_id = list[loop].inquiries_id;

        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // Getting the property type
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        var ptquery = PT.find({}).where('_id').equals(pt_id).select({"__v":0});

        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // Getting the property address
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        var paquery = PA.find({}).where('_id').equals(pa_id).select({"__v":0});

        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // Getting the property detail
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        var pdquery = PD.find({}).where('_id').equals(pd_id).select({"__v":0});

        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // Getting the propertyinquiry
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        var piquery = PI.find({}).where('_id').equals(pi_id).select({"__v":0});

        var resources = {
            Type        :   ptquery.exec.bind(ptquery),
            Address     :   paquery.exec.bind(paquery),
            Detail      :   pdquery.exec.bind(pdquery),
            Inquiry     :   piquery.exec.bind(piquery)
        };

        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // Asynchrozing the queries
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        async.parallel(resources, function (error, results){
            if (error) {
                response.status(500).send(error);
                return;
            }

            testresult += results;
            //console.log(results);
        });
    }


    console.log(testresult);
    response.json({success: true, data: list, message: 'Successfully fetched all property.'});
});

};

当我记录&#34;结果&#34; var inside for循环,它有一个数据 但是当我尝试记录&#34; testresult&#34; var,未定义

我会做什么才能获得我的愿望?

1 个答案:

答案 0 :(得分:1)

只需使用 $lookup 运算符从其他集合执行连接,您可以在同一数据库中指定集合以执行连接,并将结果存储在数组字段中添加到输入文档。

以下示例演示了 $lookup 的操作。要获得所需的输出,您需要在结果数组上应用 $arrayElemAt 运算符,这将返回由索引指定的数组中的子文档,在这种情况下为0,因为它是唯一的元素 在数组中(一对一关系的结果将为单个元素数组提供 $lookup ):

var PL = require('../models/list');
var cryption    = require('../services/encrypt_decrypt');
var crypt = new cryption();

module.exports.read = function (request, response) {
    var decryptedId = crypt.decrypt(request.decode.id);

    PL.aggregate([
        { "$match": { "account_id": mongoose.Types.ObjectId(decryptedId) } },
        {
            "$lookup": {
                "from": "pt", /* make sure the underlying collection name is correct */
                "localField": "type_id",
                "foreignField": "_id",
                "as": "types"
            }
        },
        {
            "$lookup": {
                "from": "pa", /* make sure the underlying collection name is correct */
                "localField": "address_id",
                "foreignField": "_id",
                "as": "addresses"
            }
        },
        {
            "$lookup": {
                "from": "pd", /* make sure the underlying collection name is correct */
                "localField": "detail_id",
                "foreignField": "_id",
                "as": "details"
            }
        },
        {
            "$lookup": {
                "from": "pi", /* make sure the underlying collection name is correct */
                "localField": "inquiries_id",
                "foreignField": "_id",
                "as": "inquiries"
            }
        },
        {
            "$project": {
                "account_id": 1,
                "type": { "$arrayElemAt": ["$types", 0] },
                "detail": { "$arrayElemAt": ["$addresses", 0] },
                "address": { "$arrayElemAt": ["$details", 0] },
                "inquiries": { "$arrayElemAt": ["$inquiries", 0] },
            }           
        }
    ]).exec(function (error, results){
        if (error) {
            response.status(500).send(error);           
        }

        console.log(results);
        response.json({
            success: true, 
            data: results, 
            message: 'Successfully fetched all property.'
        });
    });
};