如何使用mongoose从节点js中收集数据

我在我的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文件

列表集合将具有另外4个集合的ID。

这是我试图实现的

 [ { "_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; } 

我会使用asynchronous内循环,然后使用+=其连接到“testresult”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.'}); }); }; 

当我logging“结果”var内循环,它有一个数据,但当我尝试logging“testresult”变种,它是未定义的

我会做什么得到我的欲望输出?

只需使用$lookup操作符来执行其他集合中的连接,您可以在同一个数据库中指定集合来执行连接,并将结果存储在添加到input文档的数组字段中。

以下示例演示$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.' }); }); };