MongoDB在数组对象中获取最新的文档



我的Schema看起来像这样:

{
id: {
type: String,
required: true,
unique: true,
},
names: [
{
value: { type: String, required: true },
changed_at: { type: Date, index: true, default: Date.now },
},
],
}

通过聚合,我想找到我的集合中最近日期的3个文档名称->changed_at.

我试过这样做:

[
{ $unwind: '$names' },
{ $sort: { 'names.changed_at': -1 } },
{
$group: {
_id: '$_id',
names: { $push: { value: '$names.value', changed_at: '$names.changed_at' } },
id: { $first: '$id' },
},
},
{ $limit: 3 },
{
$lookup: {
from: 'users',
localField: 'id',
foreignField: 'id',
as: 'user',
},
},
{ $unwind: '$user' },
{
$project: {
_id: 0,
old_name: { $first: '$names' },
user: { avatar_url: 1, current_tag: 1 },
},
},
]

但是这不会返回最近更新的3个文档。我该如何填写我的查询?

查询
  • "names.changed_at"
  • 上创建多键索引
  • 对数组(names.changed_at)按-1排序,类似于基于数组
  • 的最大成员排序

此处测试代码

db.collection.aggregate([
{
"$sort": {
"names.changed_at": -1
}
},
{
"$limit": 3
}
])

Query2(另一种解决方案,如手动执行上面所做的自动)

  • 为每个文档设置最大日期,作为额外的字段
    (它是文档的代表),显示所有文档中的最后日期名称数组)
  • 按it排序
  • 限制3

=比;你有3个具有最新日期的文档
(查询不返回3个最新的全局日期,它们可以都在一个文档中)

为了简单起见,我用了数字,日期也一样。

此处测试代码

db.collection.aggregate([
{
"$set": {
"max-date": {
"$max": "$names.changed_at"
}
}
},
{
"$sort": {
"max-date": -1
}
},
{
"$limit": 3
}
])

如果你能发送一些关于性能的反馈,如果你有大量的收集。比较这两种方式

第二个查询可以超级快,如果你添加到你的模式,字段"max-date"(带索引),并更新它,当你添加日期在names(这将使非常小的索引,而且肯定会很快)

最新更新