mongodb - 分页时根据唯一字段mongodb获取数据

标签 mongodb pymongo

抱歉,如果标题有误,但这是我正在尝试做的,假设我有对象:

{"_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"
    }
  }
])

Mongo Playground

如果您对架构或更新另一个集合持开放态度,这将是最好的,例如,您可以创建另一个仅包含第一个文档的集合。这将允许轻松分页,在更新时维护它也有点容易,但如果你有很多删除,这种方法也不是最佳的,我建议你去改变模式。

关于mongodb - 分页时根据唯一字段mongodb获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74290603/

相关文章:

python - PyMongo 使用元数据排序

javascript - 如何使用 flask 将数据传递给 chart.js?

linux - 从 Windows 和 Mac 客户端机器访问 MongoDB

node.js - 如何使用 arrayFilters 更新数组中的元素

mongodb - 如何使用golang在mongodb中插入多数组

python - pymongo 中的 collection.getIndexes() shell 命令的等价物是什么?

python - 由于类型错误 : not enough arguments for format string,无法创建索引

mongodb - 从 Azure 应用服务连接到 MongoDB Atlas 集群

javascript - 在原子操作中测试和递减?

python - 如何使用 python for mongodb 中的 Pymongo 查找最近 5 秒添加到表中的条目