mongodb - 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”,因此查询的预期结果应该为空 []。但我得到了一份文件。
请有人告诉这怎么可能
解决方案
您正在寻找可以使用 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)
推荐阅读
- c++ - 将 QBuffer 设置为大小受限的 FIFO ?QT
- apache-camel - 如何强制停止 Apache Camel 交换?
- python-3.x - 使用 writerow 将元素列表放在同一行中
- python - 使用 PySide 覆盖 QPushButton 类事件方法
- sql - 定义连接条件
- c++ - 内部模板类 c++
- powershell - 对哈希表进行排序并放入新的哈希表
- ios - iOS Cordova 媒体插件在后台:MEDIA_ERR_NONE_SUPPORTED = 4
- css - CSS :nth-of-type() nuxt-link 的选择器
- vba - Vba:无法使用 ActiveWorkbook 命令将对象建立为范围,抛出错误 91