如果标题有误,很抱歉,但以下是我正在try 做的事情,假设我有对象:

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

我想知道在没有聚合的情况下是否可能,以及/或者它是否会有正确的性能.

我也想看看工作中的例子,提前谢谢!

推荐答案

我想知道在没有聚合的情况下是否可能,以及/或者它是否会有正确的性能.

不,这不可能.

不幸的是,在Mongo中没有有效的方法来实现这一点.您必须首先按Content ID对所有文档进行$group次排序,然后我们必须对它们重新排序,因为$group不会保持顺序.

在这一点上,我们将能够使用$skip$limit进行分页,显然,正如您可以看出的那样,这是非常低效的.

db.collection.aggregate([
  {
    $group: {
      _id: "$contentID",
      first: {
        $first: "$$ROOT"
      }
    }
  },
  {
    $sort: {
      "first._id": 1
    }
  },
  {
    $limit: 2
  },
  {
    $replaceRoot: {
      newRoot: "$first"
    }
  }
])

Mongo Playground

如果您愿意接受模式操作或更新另一个集合,这将是最好的 Select ,例如,您可以创建另一个仅包含第一个文档的集合.这将允许轻松进行分页,在更新时维护它也比较容易,但如果您有很多删除,这种方法也不是最佳的,我建议您进行模式更改.

Mongodb相关问答推荐

在单个mongo文档中组合数组与聚合

MongoDB与合并对象聚合

在MongoDB集合中按文档内的频率对数组排序

Mongo 聚合将 $sort 与 $geoNear 结合使用

如何使用指南针连接到 mongodb replicaset (k8s)

MongoDB聚合:如何将查找结果放入嵌套数组中?

CouchDB 或 MongoDB 中的哪一个适合我的需求?

TypeError:Cannot read property '_id' of undefined

使用 Spring Boot >= 2.0.1.RELEASE 将 ZonedDateTime 保存到 MongoDB 时出现 CodecConfigurationException

为什么不建议在 MongoDB 中使用服务器端存储函数?

带有 jQ​​uery Ajax/JSON 前端的 MongoDB 或 CouchDB 中间件

使用已排序的数据获取不同的值

如何从 node.js 以编程方式执行 mongodump 命令?

如何在 MongoDB Map-reduce 映射函数中使用变量

Mongo:无法在 src/mongo/shell/mongo.js:145 连接到服务器 127.0.0.1:27017

指定在 mongodb .js 脚本中使用哪个数据库

MongoDB 查询:字段不存在或具有特定值

PyMongo 中的警告消息:count is deprecated

如何使用 mongoose 连接到 mongoDB Atlas

MongoTemplate upsert - 从 pojo 进行更新的简单方法(哪个用户已编辑)?