【问题标题】:Need help to search document with random field names需要帮助以随机字段名称搜索文档
【发布时间】:2014-08-11 06:37:57
【问题描述】:

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

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

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

_XC4ucB8sEeSybaax341rBg 将在 doc 到 doc 之间更改为另一个随机字符串,对于所有 docs,它将再次位于同一位置。

其他字段不改名,保持不变。

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

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

    "quotas": [
      {
        "days": 365,
        "thresholds": {},
        "credits": [
          {
            "id": "_XC4ucB8sEeSybaax341rBg"
          }
        ]
      }
    ]
    

    【讨论】:

      【解决方案2】:

      我想到了两种情况。从问题中我不清楚哪一种适用于您,因此提供两种可能性。

      案例 1:

      您将始终在 quotas 内有 366_DAYS、2_HOURS35_DAYS,并且每个文档只有一个可能的 creditId .如果是这种情况,那么为什么要复制 quotaCodecreditId 作为子字段和 quotas 中的键>学分。您可以按如下方式更改文档的结构:

      {
          "_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:

      quotascredits 可能包含多个子文档。在这种情况下,viktortnk 的 方法将 quotascredits 作为数组将起作用。您查询的 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"
      

      【讨论】:

        猜你喜欢
        • 2017-06-07
        • 1970-01-01
        • 1970-01-01
        • 2020-08-03
        • 2014-05-20
        • 2015-01-25
        • 1970-01-01
        • 2020-06-06
        • 2013-12-26
        相关资源
        最近更新 更多