需要帮助搜索具有随机字段名称的文档

时间:2014-08-08 21:07:17

标签: mongodb

我查看了MongoDB文档并搜索了这个问题,但无法找到合适的答案。

遇到我需要在集合中搜索文档的问题,但是3个字段名称将从一个文档更改为另一个文档,即使它们始终位于相同的位置。

在以下示例中,366_DAYS可以是2_HOURS35_DAYs等,从文档到文档,但它们将处于相同的位置。

_XC4ucB8sEeSybaax341rBg将更改为从doc到doc的另一个随机字符串,同样,它将在所有文档的相同位置。

其他字段不会更改名称并保持在同一位置。

我想要一个查询来搜索debitAmount >=creditAmountendDate > 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"
 }

2 个答案:

答案 0 :(得分:0)

您可以为quotascredits使用数组吗?这将使路径相同。

"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"