nodejs / Mongo - 多个查找不起作用

时间:2017-03-28 11:06:26

标签: node.js mongodb

仍然是Node / Mongo的NooB,我坚持这个。

我有两个mongo系列,Tenants和Rent。租户集合在架构中具有租户_id。以下功能正在搜索所有活动租户,并为每个租户提取最新租赁文档的某些属性。 函数的第一部分使用结果填充租户对象。一切顺利。 第二个。然后开始迭代租户对象,拉出_id以在Rent查询中使用。 (加入)。 问题是for循环似乎迭代并正确打印_id,但第二个查找查询似乎只打印出对象中的最后一个文档。我只是不确定为什么会发生这种情况

提前致谢

app.get('/chargerenttest/:date', (req,res) => {

//check date is valid
var rentChargeDate = new Date(req.params.date);
var tenant = "";
//for each active tenant



 Tenant .find({
           activeTenant : true
            })
         .then ((tenant) => {          
          if (!tenant) {
             return res.status(404).send();
           }
           console.log("found tenents")
           return tenant
          })

          .then ((tenant) => {
           for (var i in tenant) {
                console.log(i)
                console.log(tenant[i]._id)

               Rent 
                .find({
                  "paymentType" :"Rent",
                  "tenantID" : tenant[i]._id,
                  "activeEntry": true})
                .limit(1)
                .sort({datePaid: -1})
                  // sort in decending date ( latested on top)
                .then ((rent) => {
                      lastPayment = rent[0].datePaid;
                      lastAmountPaid = rent[0].amountPaid;

                      console.log("--------",i)

                      console.log("tenant",tenant[i]._id)
                      console.log("rentamount",tenant[i].rentAmount)
                      console.log("lastpayment", lastPayment)           
                  });           
             }

           })

})

2 个答案:

答案 0 :(得分:1)

通过运行使用带有 $lookup 运算符的管道的聚合操作可以简化您的查询,该运算符允许您对同一数据库中的另一个集合执行左外连接过滤来自“已加入”集合的文档以进行处理。

考虑运行以下管道:

Rent.aggregate([
    {
        "$match": {
            "paymentType": "Rent",
            "activeEntry": true
        }
    },
    {
        "$lookup": {
            "from": "tenants",
            "localField": "tenantID",
            "foreignField": "_id",
            "as": "tenants"
        }
    },
    { "$match": { "tenants": { "$ne": [] }, "tenants.activeTenant": true } },
    //{ "$unwind": "$tenants" },
    { "$sort": { "datePaid": -1 } },
    { "$limit": 1 }     
]).exec((err, rent) => {
    if (err) throw err;

    lastPayment = rent[0].datePaid;
    lastAmountPaid = rent[0].amountPaid;
    tenant = rent[0].tenants[0];

    console.log("tenant",tenant._id)
    console.log("rentamount",tenant.rentAmount)
    console.log("lastpayment", lastPayment) 
});

答案 1 :(得分:0)

这个模块@coolgk/mongo可以使加入多个集合变得更加简单。

实施例

SQL to Mongo Join

左加入

SELECT * FROM a LEFT JOIN b ON a.b_id = b.id

变为

model.find({}, {
    join: [ { on: 'b_id' } ]
})

结果:

[{
    _id: '5a8bde4ae2ead929f89f3c42',
    a_name: 'aname1',
    b_id: {
        _id: '5a8bde4ae2ead929f89f3c41',
        b_name: 'bname1'
    }
}, { ... }, ... ]
内约加入约束

SELECT * FROM a, b WHERE a.b_id = b.id AND b.b_name = 'bname1'

变为

model.find({}, {
    join: [ { on: 'b_id', filters: { b_name: 'bname1' } } ]
})

结果:

[{
    _id: '5a8bdfb05d44ea2a08fa8a4c',
    a_name: 'aname2',
    b_id: {
        _id: '5a8bdfb05d44ea2a08fa8a4b',
        b_name: 'bname2'
    }
}]
内部加入Mulitple馆藏

SELECT * FROM a, b, c WHERE a.b_id = b.id AND b.c_id = c.id AND c.c_name = 'cname3'

变为

modela.find({}, {
    join: [{
        on: 'b_id',
        join: [{
            on: 'c_id',
            filters: { c_name: 'cname3' }
        }]
    }]
})

结果:

[{
    _id: '5a8bdfc1b07af22a12cb1f0b',
    a_name: 'aname3',
    b_id: {
        _id: '5a8bdfc1b07af22a12cb1f0a',
        b_name: 'bname3',
        c_id: {
            _id: '5a8bdfc1b07af22a12cb1f09',
            c_name: 'cname3'
        }
    }
}]