首页 > 解决方案 > Mongo 内嵌文档字段查询

问题描述

我有一个现有的集合,其中包含类似于下面的文档

{
    "_id" : UUID("ef2f3778-c74a-4a40-9169-a7798bc6c776"),
    "feedId" : UUID("677d0a5a-0ceb-43d9-954d-bfefddc22ca2"),
    "events" : {
        "1500" : {
            "t" : ISODate("2020-08-20T02:25:00.000Z"),
            "a" : {
                "Manager" : "Joe",
                "Amount" : 20.3
            }
        },
        "1800" : {
            "t" : ISODate("2020-08-20T02:30:00.000Z"),
            "a" : {
                "Manager" : "Joe",
                "Amount" : 21.3
            }
        },
        "2100" : {
            "t" : ISODate("2020-08-20T02:35:00.000Z"),
            "a" : {
                "Manager" : "Joe",
                "Amount" : 22.3
            }
        },
        "2400" : {
            "t" : ISODate("2020-08-20T02:40:00.000Z"),
            "a" : {
                "Manager" : "Joe",
                "Amount" : 23.3
            }
        }
    }
}

我对返回所有按时间排序的 Amount 字段值(“t”字段)的查询感兴趣。现在,我认识到“事件”嵌入文档很可能结构不正确。它应该是一个数组。但这是我担心的手,即没有选择更改文件的选项。如何从具有相同 feedId 的集合中的所有对象中获取返回类似于 [20.3、21.3、22.3、23.3 等] 的查询?

编辑:我将补充一点,事件对象/文档在每个集合对象中没有统一的名称。即在这里您看到 1500、1800、2100 等。这个文件但下一个文件可能只有 1500 和 3000。

参考另一个有同样问题但似乎碰壁的帖子(没有将文档架构更改为数组):

MongoDB查询嵌入式文档字段

标签: mongodbmongodb-query

解决方案


试试这个查询并检查它是否是你期望的行为(这里的例子)

请注意,我已经更改了数字的日期以便于阅读。

db.collection.aggregate([
  {
    "$match": {
      "feedId": 2
    }
  },
  {
    "$project": {
      "events": {
        "$objectToArray": "$events"
      }
    }
  },
  {
    "$unwind": "$events"
  },
  {
    "$sort": {
      "events.v.t": 1
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "events": {
        "$push": "$events"
      }
    }
  },
  {
    "$addFields": {
      "count": "$events.v.a.Amount"
    }
  },
  {
    "$project": {
      "count": 1,
      "_id": 0
    }
  }
])

首先$matchfeedId字段,然后是必要的使用,$objectToArray因为您的模式是由键值对象复合的。
然后$unwind可以$sort重新组合。
之后,我添加了一个count包含总金额的新字段,并且我曾经$project只缩短这个字段。


推荐阅读