如何从 MongoDB 中的数组中查询具有最新日期的对象?

Posted

技术标签:

【中文标题】如何从 MongoDB 中的数组中查询具有最新日期的对象?【英文标题】:How can I query the object with the latest date from an array in MongoDB? 【发布时间】:2021-11-07 20:05:21 【问题描述】:

我已经尝试并在谷歌上搜索了很长时间,但从未到达任何港口。

如果我有一个像这样的集合

[

    "_id": "61394b1dbccf101ef4f57517",  # It's an object Id
    "name": "name-A",
    "throws": [
        
            "date": "2021-08-11T00:00:00.000Z",
            "numberA": 3333,
            "numberB": 1241,
            "numberC": 1234,
        ,
        
            "date": "2021-08-16T00:00:00.000Z",
            "numberA": 6744,
            "numberB": 8656,
            "numberC": 2345,
        ,
        
            "date": "2021-08-13T00:00:00.000Z",
            "numberA": 1234,
            "numberB": 5432,
            "numberC": 7556,
        ,
    ],
,

    # Another document (aka object)
,

    # Another document (aka object)
,
...
]

我想查询集合,以便....给定一个 ObjectId,Mongo 根据其日期属性返回名为“throws”的数组的最新项,用于具有给定 id 的文档。请注意,日期可能会或可能不会被订购。给出我描述的集合和 id:"61394b1dbccf101ef4f57517":


    "date": "2021-08-16T00:00:00.000Z",
    "numberA": 6744,
    "numberB": 8656,
    "numberC": 2345,

raw mongo-cli 的解决方案和 js-mongoose 的解决方案都可以帮助我。但如果你能解释一下这在 raw mongo 中是如何工作的,我想这对我的学习会更好......

提前致谢!

【问题讨论】:

【参考方案1】:

您可以使用此聚合查询:

首先$match 由您想要的_id。 然后$unwind 解构数组。 仅当您的数据是字符串而不是ISODate 时才使用此$set 阶段。如果数据是日期,则不需要此步骤。这是为了创建ISODate 对象进行排序。 也可以使用$sort。 然后$gorup 给出$first 值。由于使用了$sort,第一个值将是期望值。
db.collection.aggregate([
  
    "$match": 
      "_id": "61394b1dbccf101ef4f57517"
    
  ,
  
    "$unwind": "$throws"
  ,
  
    "$set": 
      "throws.date": 
        "$toDate": "$throws.date"
      
    
  ,
  
    "$sort": 
      "throws.date": -1
    
  ,
  
    "$group": 
      "_id": "$_id",
      "name": 
        "$first": "$name"
      ,
      "throws": 
        "$first": "$throws"
      
    
  
])

例如here

【讨论】:

好吧,这不是我想要的,但它是一个非常好的 VVVVERY ......我会尝试在我的代码中这样做,然后我会回来告诉结果

以上是关于如何从 MongoDB 中的数组中查询具有最新日期的对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 findOne 查询 mongodb 并排除数组中的一些嵌套字段

如何设置子查询以获取具有最新日期和最大 ID 的单个记录?

如何仅从组中查询具有最新时间戳的文档?

MongoDB查询以选择具有所有元素都匹配某些条件的数组的文档

MongoDB查询:如何查找嵌套对象中的字符串

在Java中查询具有完全匹配字段MongoDB的数组元素