如何使用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.' }); }); };
- 元素在点(1254,21)不可点击。 其他元素将获得点击
- 如何使用node.js和javascript来模仿Facebook的“链接共享”function
- 如何使用Node.js从json文件中读取数据并将读取的数据显示到html中?
- 我怎样才能用Node.js刮页面
- 使用gmail的Nodemailer,无法在string“SMTP”上创build属性“邮件程序”
- 安装socket.io返回(node-gyp rebuild 2> builderror.log)|| (出口0)
- 如何在Sequelize Js中使用Promise来返回实体
- 过滤和映射在相同的迭代
- 从node.js / express传递数组到jade模板