我的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,未定义
我会做什么才能获得我的愿望?
答案 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.'
});
});
};