当对象没有字段名称时,如何查询对象数组中的“expiryDate”字段?

问题描述 投票:0回答:1

我正在使用一个包含如下结构对象的 JSON 文件:

[
  {
    "_id": { "$oid": "65143f76653355483f68981d" },
    "date": "2023-09-27",
    "certificates": [
      { "cnv2234": { "expiryDate": "2024-08-17" } },
      { "crs14359": { "expiryDate": "2023-09-14" } },
      { "crs14359": { "expiryDate": "2030-03-06" } },
      { "crs14359": { "expiryDate": "2040-02-25" } }
    ]
  }
]

我尝试过各种查询,例如:

query = { "certificates.expiryDate": { "$lte": "2023-09-14" } }
query = { "certificates": { "$elemMatch": { "expiryDate": { "$lte": "2023-09-14" } } } }
query = { "certificates": { "$elemMatch": { "expiryDate": { "$lte": "2023-09-14" } } } }

这些查询均未返回任何数据。虽然我可以成功检索所有数据并单独迭代每个主机和日期,但这对于较大的数据集来说并不实用。当对象没有字段名称时,有人可以指导我如何纠正此查询,以便根据对象数组中的“expiryDate”进行有效过滤吗?

python json mongodb mongodb-query
1个回答
0
投票

对于您当前的架构,需要考虑一些事项,建议您重构它。

  1. 日期存储在字符串中。日期应存储为适当的日期对象以供查询。
  2. 当前使用动态值作为字段名称。像this那样重构模式,以避免不必要的查询复杂性。

不过,对于你目前的情况,你可以使用

$objectToArray
来查询。

db.collection.aggregate([
  {
    "$set": {
      "certificates": {
        "$map": {
          "input": "$certificates",
          "as": "c",
          "in": {
            "$objectToArray": "$$c"
          }
        }
      },
      "raw": "$$ROOT"
    }
  },
  {
    $set: {
      "certificates": {
        "$reduce": {
          "input": "$certificates",
          "initialValue": [],
          "in": {
            "$concatArrays": [
              "$$value",
              "$$this"
            ]
          }
        }
      }
    }
  },
  {
    "$match": {
      "certificates.v.expiryDate": {
        "$lte": "2023-09-14"
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": "$raw"
    }
  }
])

蒙戈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.