抱歉,如果标题有误,但这是我正在尝试做的,假设我有对象:
{"_id": "anyID0", "contentID": "content1", "value": "any value", "at": 10}
{"_id": "anyID1", "contentID": "content1", "value": "any value", "at": 9}
{"_id": "anyID2", "contentID": "content2", "value": "any value", "at": 8}
{"_id": "anyID3", "contentID": "content3", "value": "any value", "at": 7}
我想执行一个查询:
- 使用
limit
获取 20 个这样的对象 - 让它们按
at
descending
排序 - 如果查询与已查询的
contentID
匹配,则跳过它而不将其视为结果。
以上述对象为例:
如果我使用 query.limit(2)
其中 query
是我在这里问的那个,我希望结果是:
{"_id": "anyID0", "contentID": "content1", "value": "any value", "at": 10}
{"_id": "anyID2", "contentID": "content2", "value": "any value", "at": 8}
所以它跳过了 {"_id": "anyID1", "contentID": "content1", "value": "any value", "at": 9}
我想知道如果没有聚合是否可能和/或它是否会有正确的性能。
我也想看看工作示例,提前致谢!
最佳答案
I would like to know if it's possible without aggregation and / or if it would have correct performances.
不,这不可能。
不幸的是,在 Mongo 中没有有效的方法来实现这一点。您必须首先按 contentId $group
所有文档,然后我们必须再次对它们进行排序,因为 $group
不保留顺序。
在这一点上,我们将能够使用 $skip
和 $limit
进行分页,显然您可以看出这是非常低效的。
db.collection.aggregate([
{
$group: {
_id: "$contentID",
first: {
$first: "$$ROOT"
}
}
},
{
$sort: {
"first._id": 1
}
},
{
$limit: 2
},
{
$replaceRoot: {
newRoot: "$first"
}
}
])
如果您对架构或更新另一个集合持开放态度,这将是最好的,例如,您可以创建另一个仅包含第一个文档的集合。这将允许轻松分页,在更新时维护它也有点容易,但如果你有很多删除,这种方法也不是最佳的,我建议你去改变模式。
关于mongodb - 分页时根据唯一字段mongodb获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74290603/