我正在寻找一个查询,该查询只能返回嵌入在主文档的另一个数组内的数组内的某些文档。 下面是存储在数据库中的集合:
{
"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
}
}
是否有查询来实现? 谢谢。
答案 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>