如何通过猫鼬查询返回嵌入式文档的过滤结果

时间:2020-06-11 09:03:13

标签: node.js mongodb mongoose

我正在寻找一个查询,该查询只能返回嵌入在主文档的另一个数组内的数组内的某些文档。 下面是存储在数据库中的集合:

{
    "List": {
        "_id": "5ee1c1e6739bb23e3c54d35c",
        "capitalAccountID": "CaptialAccount-43",
        "userEmail": "kumarshreyas073@gmail.com",
        "flagID": 1,
        "ledgerName": "Capital Account",
        "subLedgers": [
            {
                "openingBalance": 100000,
                "closingBalance": 90001,
                "transactions": [
                    {
                        "_id": "5ee1c1e6739bb23e3c54d35e",
                        "transactionID": "123456",
                        "date": "09/06/2020",
                        "particulars": "By-sales",
                        "voucherNumber": "asdfghjk",
                        "voucherType": "SR",
                        "credit": 0,
                        "debit": 1
                    },
                    {
                        "_id": "5ee1c1e6739bb23e3c54d35f",
                        "transactionID": "123457",
                        "date": "10/06/2020",
                        "particulars": "By-sales",
                        "voucherNumber": "asdfghjk",
                        "voucherType": "SR",
                        "credit": 5000,
                        "debit": 0
                    },
                    {
                        "_id": "5ee1c1e6739bb23e3c54d360",
                        "transactionID": "123458",
                        "date": "11/06/2020",
                        "particulars": "By-sales",
                        "voucherNumber": "asdfghjk",
                        "voucherType": "SR",
                        "credit": 5000,
                        "debit": 0
                    }
                ],
                "_id": "5ee1c1e6739bb23e3c54d35d",
                "subLedgerID": 1,
                "subLedgerName": "ABC",
                "reference": "dghj",
                "rateOfDuty": 10,
                "gstApplicable": true
            },
            {
                "openingBalance": 100000,
                "closingBalance": 95001,
                "transactions": [
                    {
                        "_id": "5ee1c1e6739bb23e3c54d362",
                        "transactionID": "123459",
                        "date": "13/06/2020",
                        "particulars": "By-sales",
                        "voucherNumber": "asdfghjk",
                        "voucherType": "SR",
                        "credit": 0,
                        "debit": 1
                    },
                    {
                        "_id": "5ee1c1e6739bb23e3c54d363",
                        "transactionID": "123450",
                        "date": "14/06/2020",
                        "particulars": "By-sales",
                        "voucherNumber": "asdfghjk",
                        "voucherType": "SR",
                        "credit": 5000,
                        "debit": 0
                    },
                    {
                        "_id": "5ee1c1e6739bb23e3c54d364",
                        "transactionID": "123451",
                        "date": "15/06/2020",
                        "particulars": "By-sales",
                        "voucherNumber": "asdfghjk",
                        "voucherType": "SR",
                        "credit": 5000,
                        "debit": 0
                    },
                    {
                        "_id": "5ee1c1e6739bb23e3c54d365",
                        "transactionID": "123452",
                        "date": "16/06/2020",
                        "particulars": "By-sales",
                        "voucherNumber": "asdfghjk",
                        "voucherType": "SR",
                        "credit": 0,
                        "debit": 5000
                    }
                ],
                "_id": "5ee1c1e6739bb23e3c54d361",
                "subLedgerID": 2,
                "subLedgerName": "DEF",
                "reference": "dohj",
                "rateOfDuty": 10,
                "gstApplicable": true
            }
        ],
        "idCounter": 43,
        "__v": 0
    }
}

下面的代码返回以上结果:

await CaptialAccount.findOne(
    {
      userEmail: req.body.userEmail,
    },
    (err, list) => {
      res.status(200).json({
        List: list
      })
    }
  );

我需要根据日期过滤“ subLedgers”数组中的“ transactions”数组。 例如:从“ 09/06/2020”到“ 13/06/2020”。 预期输出:

{
    "List": {
        "_id": "5ee1c1e6739bb23e3c54d35c",
        "capitalAccountID": "CaptialAccount-43",
        "userEmail": "kumarshreyas073@gmail.com",
        "flagID": 1,
        "ledgerName": "Capital Account",
        "subLedgers": [
            {
                "openingBalance": 100000,
                "closingBalance": 90001,
                "transactions": [
                    {
                        "_id": "5ee1c1e6739bb23e3c54d35e",
                        "transactionID": "123456",
                        "date": "09/06/2020",
                        "particulars": "By-sales",
                        "voucherNumber": "asdfghjk",
                        "voucherType": "SR",
                        "credit": 0,
                        "debit": 1
                    },
                    {
                        "_id": "5ee1c1e6739bb23e3c54d35f",
                        "transactionID": "123457",
                        "date": "10/06/2020",
                        "particulars": "By-sales",
                        "voucherNumber": "asdfghjk",
                        "voucherType": "SR",
                        "credit": 5000,
                        "debit": 0
                    },
                    {
                        "_id": "5ee1c1e6739bb23e3c54d360",
                        "transactionID": "123458",
                        "date": "11/06/2020",
                        "particulars": "By-sales",
                        "voucherNumber": "asdfghjk",
                        "voucherType": "SR",
                        "credit": 5000,
                        "debit": 0
                    }
                ],
                "_id": "5ee1c1e6739bb23e3c54d35d",
                "subLedgerID": 1,
                "subLedgerName": "ABC",
                "reference": "dghj",
                "rateOfDuty": 10,
                "gstApplicable": true
            },
            {
                "openingBalance": 100000,
                "closingBalance": 95001,
                "transactions": [
                    {
                        "_id": "5ee1c1e6739bb23e3c54d362",
                        "transactionID": "123459",
                        "date": "13/06/2020",
                        "particulars": "By-sales",
                        "voucherNumber": "asdfghjk",
                        "voucherType": "SR",
                        "credit": 0,
                        "debit": 1
                    }
                ],
                "_id": "5ee1c1e6739bb23e3c54d361",
                "subLedgerID": 2,
                "subLedgerName": "DEF",
                "reference": "dohj",
                "rateOfDuty": 10,
                "gstApplicable": true
            }
        ],
        "idCounter": 43,
        "__v": 0
    }
}

是否有查询来实现? 谢谢。

1 个答案:

答案 0 :(得分:1)

为此,您必须使用管道,利用$filter。与查询$elemMatch等效的查询只能用于返回数组中符合条件的第一项。

db.collection.aggregate([
    {
        $match: {
            userEmail: req.body.userEmail,
        }
    },
    {
        $addFields: {
            "List.subLedgers": {
                $map: {
                    input: "$List.subLedgers",
                    as: "subLedger",
                    in: {
                        $mergeObjects: ["$$subLedger", {
                            transactions: {
                                $filter: {
                                    input: "$$subLedger.transactions",
                                    as: "transaction",
                                    cond: {
                                        $and: [
                                            {
                                                $gte: ["$$transaction.date", "start date"]
                                            },

                                            {
                                                $lte: ["$$transaction.date", "end date"]
                                            }
                                        ]
                                    }
                                }
                            }
                        }]
                    }
                }
            }
        }
    }
])

从看来您的交易日期被保存为字符串的方式来看,虽然我们不建议这样做,但是只要您可以保证它们都在相同的时区和格式中,就可以了。

/ p>