database - MongoDB聚合对相同值的不同响应进行排序
问题描述
当我使用 mongodb 聚合进行分页时,我发现了一个问题。我会详细介绍一下。此问题仅在排序时发生。我做了一个模式来保持简单。模型有一个随机生成的计数(数字)用于排序,并具有 id(数字),以便我们可以直观地进行操作并且它是唯一的。
聚合管道如
db.getCollection('test').aggregate([{
$sort:{
count:-1
}
},
{
$skip : 0
},
{
$limit :2
}])
示例限制 2 返回的数据
/* 1 */
{
"_id" : ObjectId("6027005ffba493078dca3580"),
"count" : 9,
"id" : 38
}
/* 2 */
{
"_id" : ObjectId("6027005ffba493078dca3565"),
"count" : 9,
"id" : 11
}
当限制示例 3 返回数据
/* 1 */
{
"_id" : ObjectId("6027005ffba493078dca3587"),
"count" : 9,
"id" : 45
}
/* 2 */
{
"_id" : ObjectId("6027005ffba493078dca3580"),
"count" : 9,
"id" : 38
}
/* 3 */
{
"_id" : ObjectId("6027005ffba493078dca3565"),
"count" : 9,
"id" : 11
}
对于限制 2 第一个元素 id = 38,对于限制 3 第一个元素 id = 45
对于不同的限制跳过值,对于相同的值排序,它总是返回不同的响应。这个问题使我无法正确分页。
如果我添加第二个排序示例
$sort:{
count:-1
_id: 1
}
}
它已解决。
是什么原因?和另一个解决方案?
解决方案
这是在执行 limit:2 聚合示例后立即插入具有 id:45 的文档时的预期行为,limit:3 示例将在顶部显示具有 id:45 的文档,因为已加载文档/索引以进行排序基于文档 _id 的自然插入顺序,并且 _id 单调递增已经排序。基于上述情况,我认为如果您在排序阶段也添加 _id 没有任何区别,因为如果未指定文档将根据 _id 自动排序,并且所有文档的计数值都相同......
推荐阅读
- java - 在 WebView 中隐藏特定页面的键盘
- node.js - 在 readdir 中使用 readdir 后如何向客户端发送数据
- php - 无法在php中运行函数
- android - AndroidStudio Build 选项卡没有指向文件和行的链接?
- android-studio - 更新 Android Studio 和 Gradle 后 Gradle 项目同步失败
- c# - 在日期选择器中显示日期时间
- mysql - 错误:“列 'date_created' 不能为空”尝试创建实体时
- javascript - 我们如何发送一个隐藏在 php 中的 jquery 金额以供另一个页面检索金额值?
- performance - O*(c^n) 代表什么?它与 log * 有什么关系吗?(如果是这样 - 如何?)
- sql - Presto SQL 窗口聚合回顾 x 小时/分钟/秒