如何从 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 并排除数组中的一些嵌套字段