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

Javascript 如何使用mongoose从节点js中的集合中获取数据,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我在mongodb中有6个不同的集合,5个集合连接到一个连接,但我没有使用ref,而是我得到了5个集合的Id,然后将其保存到第6个集合,即“列表”,这样我仍然可以使用公共字段作为参考 这是我的收藏结构 list Collection var ListDoc = new mongoose.Schema({ type_id : {type: Schema.Types.ObjectId, required: true}, detail_id :

我在mongodb中有6个不同的集合,5个集合连接到一个连接,但我没有使用ref,而是我得到了5个集合的Id,然后将其保存到第6个集合,即“列表”,这样我仍然可以使用公共字段作为参考

这是我的收藏结构

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

这就是我想要达到的目标

[ {
   "_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个集合的ID,然后我尝试循环它,以便从其他集合中获取另一个数据

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循环中记录“result”变量时,它有一个数据 但是当我尝试记录“testresult”变量时,它是未定义的

我将如何获得所需的输出?

只需使用操作符从其他集合执行联接,您可以在同一数据库中指定要执行联接的集合,并将结果存储在添加到输入文档的数组字段中

以下示例演示了使用的操作。为了获得所需的输出,您需要对结果数组应用操作符,这将返回由索引指定的数组中的子文档,在本例中为0,因为它是唯一的元素 在数组中(一对一关系的结果将给出具有的单个元素数组):


谢谢您的帮助,但是当我尝试您的代码时,它会给出一个空数组,然后当我删除$match中的mongoose.Types.ObjectId()时,因为account\u id是一个字符串字段,它只给出列表集合的id和account\u id。然后,我尝试在外部字段中添加mongoose.Types.ObjectId(),因为“\u Id”是object,它给出了这个错误“错误:传入的参数必须是一个12字节的字符串或一个24个十六进制字符的字符串”。您不能添加
mongoose.Types.ObjectId()
转到
$lookup
中的
localField
foreignFields
选项。您能更新您的问题以显示所有模型的实际模式定义代码吗?谢谢您,chridam先生,我更新了我的问题,包括每个集合的模式谢谢您,chridam先生,经过几个小时的调试,最后我解决了它。我仍然使用上面的答案,问题不在于字段的类型,而在于它本身的集合名称。我创建的集合的名称与存储在数据库中的集合的名称不同,如下所示。模型或我制作的:(“地址”)在Mongodb(“地址”)很高兴你设法解决了这个问题,我发表了一些评论
/*确保基本集合名称是正确的*/
,我认为你一开始就错过了,但现在你已经找到了正确的答案,恭喜你!
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.'});
});

};
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.'
        });
    });
};