首页 > 解决方案 > Mongodb:仅查询集合的最后 N 个文档(某些部分)

问题描述

在包含 100 个文档的集合中,我想运行以下查询:

collection.find({"$text" : {"$search" : "some_string"})

假设已经存在合适的“文本”索引,因此我的问题是:如何仅在最后的“n”个文档上运行此查询?

我在网上找到的所有问题都询问如何获取最后的 n 个文档。而我的问题是如何仅搜索最后 n 个文档?

更一般地说,我的问题是如何在某个部分运行 mongo 查询,比如 20% 的集合。

我试过的

我正在使用 pymongo,所以我尝试使用 skip() 和 limit() 来获取最后 n 个文档,但我没有找到一种方法来对上述函数返回的游标执行查询。

在@hhsarh's anwser 之后,这是我试图无济于事的

# here's what I tried after initial answers
recents = information_collection.aggregate([
                {"$match" : {"$text" : {"$search" : "healthline"}}},
                {"$sort" : {"_id" : -1}},
                {"$limit" : 1},
            ])

结果仍然来自整个集合,而不是上述代码尝试的最后一条记录/文档。

最后一个文档在任何字段中都不包含“healthline”,因此查询的预期结果应该为空 []。但我得到了一份文件。

请有人告诉这怎么可能

标签: mongodbmongodb-querypymongo

解决方案


您正在寻找可以使用 MongoDB Aggregation 来实现

注意:正如@turivishal 所指出的,$text如果它不在聚合管道的第一阶段,它将不起作用。

collection.aggregate([
  {
    "$sort": {
      "_id": -1
    }
  },
  {
    "$limit": 10  // `n` value, where n is the number of last records you want to consider
  },
  {
    "$match" : {
      // All your find query goes here
    }
  },
], {allowDiskUse=true})  // just in case if the computation exceeds 100MB

由于_id默认是索引的,所以上面的聚合查询应该会更快。但是,它的性能与价值成比例地降低n

注意:如果您正在使用,请将代码示例中的最后一行替换为以下行pymongo

], allowDiskUse=True)

推荐阅读