我查看了MongoDB文档并搜索了这个问题,但无法找到合适的答案。
遇到我需要在集合中搜索文档的问题,但是3个字段名称将从一个文档更改为另一个文档,即使它们始终位于相同的位置。
在以下示例中,366_DAYS
可以是2_HOURS
,35_DAYs
等,从文档到文档,但它们将处于相同的位置。
_XC4ucB8sEeSybaax341rBg
将更改为从doc到doc的另一个随机字符串,同样,它将在所有文档的相同位置。
其他字段不会更改名称并保持在同一位置。
我想要一个查询来搜索debitAmount >=creditAmount
或endDate > now()
的记录。
set02:PRIMARY> db.account.find({ _id: "53e51b1b0cf22cb159fa5f38" }).pretty()
{
"_id" : "53e51b1b0cf22cb159fa5f38",
"_version" : 6,
"_transId" : "e3e96377-a2d2-4b75-a946-f621df182c5e-2719",
"accountBalances" : {
"TEST_TIME" : {
"thresholds" : {
},
"deprovisioned" : false,
"quotas" : {
"366_DAYS" : {
"thresholds" : {
},
"quotaCode" : "366_DAYS",
"credits" : {
"_XC4ucB8sEeSybaax341rBg" : {
"startDate" : ISODate("2014-08-08T18:46:51.351Z"),
"creditAmount" : "86460",
"endDate" : ISODate("2014-08-09T18:48:19Z"),
"started" : true,
"debits" : {
"consolidated" : {
"creationDate" : ISODate("2014-08-08T19:15:55.396Z"),
"debitAmount" : "1300",
"debitId" : "consolidated"
}
},
"creditId" : "_XC4ucB8sEeSybaax341rBg"
}
}
}
},
"expiredReservations" : {
},
"accountBalanceCode" : "TEST_TIME",
"reservations" : {
}
}
},
"subscriberId" : "53e51b1b0cf22cb159fa5f38"
}
答案 0 :(得分:0)
您可以为quotas
和credits
使用数组吗?这将使路径相同。
"quotas": [
{
"days": 365,
"thresholds": {},
"credits": [
{
"id": "_XC4ucB8sEeSybaax341rBg"
}
]
}
]
答案 1 :(得分:0)
我想到了两个案例。哪一个适用于你我不清楚这个问题,因此提供了两种可能性。
案例1:
配额中总是有 366_DAYS,2_HOURS 或 35_DAYS ,每个文档只能有一个 creditId 。如果是这种情况,那么为什么要将 quotaCode 和 creditId 复制为子字段以及配额和学分分别。您可以按如下方式更改文档的结构:
{
"_id": "53e51b1b0cf22cb159fa5f38",
"_version": 6,
"_transId": "e3e96377-a2d2-4b75-a946-f621df182c5e-2719",
"accountBalances": {
"TEST_TIME": {
"thresholds": {},
"deprovisioned": false,
"quotas": {
"thresholds": {
},
"quotaCode": "366_DAYS",
"credits": {
"startDate": ISODate("2014-08-08T18:46:51.351Z"),
"creditAmount": "86460",
"endDate": ISODate("2014-08-09T18:48:19Z"),
"started": true,
"debits": {
"consolidated": {
"creationDate": ISODate("2014-08-08T19:15:55.396Z"),
"debitAmount": "1300",
"debitId": "consolidated"
}
},
"creditId": "_XC4ucB8sEeSybaax341rBg"
}
},
"expiredReservations": {
},
"accountBalanceCode": "TEST_TIME",
"reservations": {
}
}
},
"subscriberId": "53e51b1b0cf22cb159fa5f38"
}
现在,查询中字段的 fieldPath 将是:
"accountBalances.TEST_TIME.quotas.credits.creditAmount"
"accountBalances.TEST_TIME.quotas.credits.debits.consolidated.debitAmount"
"accountBalances.TEST_TIME.quotas.credits.startDate"
案例2:
配额和点数可能包含多个子文档。在这种情况下,使用配额和信用的 viktortnk 方法可以使用数组。然后,您的查询的 fieldPath 可以写为:
"accountBalances.TEST_TIME.quotas.[zero-base-index].credits.[zero-base-index].creditAmount"
"accountBalances.TEST_TIME.quotas.[zero-base-index].credits.[zero-base-index].debits.consolidated.debitAmount"
"accountBalances.TEST_TIME.quotas.[zero-base-index].credits.[zero-base-index].startDate"