如何在mongodb中查找文档列表中字典中特定键的最大值?

watbbzwu  于 2022-11-28  发布在  Go
关注(0)|答案(1)|浏览(125)

我想用一个聚合来得到一个指定键的最大值,这个键在一个dict字段中,这个字段在一个list字段中,这个list字段在一个mongodb集合的文档中.
以下是一些示例数据

[
  {
    "name": "hi",
    "hist": [
      {
        "username": "bill",
      },
      {
        "username": "jack",
        "changed_from": 127
      }
    ]
  },
  {
    "name": "member1",
    "hist": [
      {
        "username": "asdf",
        "changed_from": 123
      },
      {
        "username": "duhby",
        "changed_from": 126
      }
    ]
  },
  {
    "name": "member5",
    "hist": [
      {
        "username": "duhby",
        "changed_from": 150
      },
      {
        "username": "test",
        "changed_from": 123
      },
      {
        "username": "duhby",
        "changed_from": 125
      }
    ]
  }
]

例如,我希望能够输入duhby作为用户名,并至少获得一个结果列表,然后我可以轻松地获得的最大值,在本例中的最大值是150
我尝试使用一个聚合组,但在尝试仅从特定用户名获取数据时遇到了问题,而不是仅从hist字段中包含该用户名的所有文档获取数据。

db.collection.aggregate([
  {
    $group: {
      "_id": "$hist.duhby",
      update_time: {
        $max: "$hist.changed_from"
      }
    }
  }
])

对于前面显示的示例数据,这将返回:

[
  {
    "_id": [],
    "update_time": [
      150,
      123,
      125
    ]
  }
]

但是,这并没有什么用处,因为它显示了每个changed_from值,而我希望它只显示(并按其排序)具有指定用户名的值。

[
  {
    "_id": [],
    "update_time": [
      150,
      125
    ]
  }
]

我还希望能够获得原始文档,并且可能将name字段作为聚合中的id,但是id当前作为空列表返回。

ajsxfq5m

ajsxfq5m1#

在这里我意识到我需要的只是一个查找,而不是一个聚合,因为我只是想看看是否有任何文档包含具有特定值的键值对的嵌入文档。

db.collection.find({
  "hist": {
    $elemMatch: {
      username: "duhby",
      changed_from: {
        "$lte": 123
      }
    }
  }
})

相关问题