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

pxy2qtax  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(144)

我正在使用一个JSON文件,其中包含这样结构的对象:

  1. [
  2. {
  3. "_id": { "$oid": "65143f76653355483f68981d" },
  4. "date": "2023-09-27",
  5. "certificates": [
  6. { "cnv2234": { "expiryDate": "2024-08-17" } },
  7. { "crs14359": { "expiryDate": "2023-09-14" } },
  8. { "crs14359": { "expiryDate": "2030-03-06" } },
  9. { "crs14359": { "expiryDate": "2040-02-25" } }
  10. ]
  11. }
  12. ]

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

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

这些查询均未返回任何数据。虽然我可以通过每个主机和日期成功地检索所有数据,但这对于较大的数据集并不实用。有人能指导我如何纠正这个查询,以便在对象没有字段名的情况下在对象数组中基于“expiryDate”进行有效过滤吗?

i7uq4tfw

i7uq4tfw1#

对于您当前的模式,有几件事情需要考虑,建议您重构它。
1.日期存储在字符串中。日期应存储为适当的日期对象,以便查询。
1.当前动态值用作字段名称。像this那样重构模式,以避免查询时不必要的复杂性。
然而,对于您当前的情况,您可以使用$objectToArray进行查询。

  1. db.collection.aggregate([
  2. {
  3. "$set": {
  4. "certificates": {
  5. "$map": {
  6. "input": "$certificates",
  7. "as": "c",
  8. "in": {
  9. "$objectToArray": "$$c"
  10. }
  11. }
  12. },
  13. "raw": "$$ROOT"
  14. }
  15. },
  16. {
  17. $set: {
  18. "certificates": {
  19. "$reduce": {
  20. "input": "$certificates",
  21. "initialValue": [],
  22. "in": {
  23. "$concatArrays": [
  24. "$$value",
  25. "$$this"
  26. ]
  27. }
  28. }
  29. }
  30. }
  31. },
  32. {
  33. "$match": {
  34. "certificates.v.expiryDate": {
  35. "$lte": "2023-09-14"
  36. }
  37. }
  38. },
  39. {
  40. "$replaceRoot": {
  41. "newRoot": "$raw"
  42. }
  43. }
  44. ])

Mongo Playground

展开查看全部

相关问题