我的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
(这将使非常小的索引,而且肯定会很快)