当前位置: 首页 > 知识库问答 >
问题:

从排序结果中在文档ID之前获取MongoDB中的N个文档

曹理
2023-03-14

我已经用概述和ID对集合进行了排序。

$sort{{ overview: 1,_id:1 }}

这就产生了这样一个集合。

当我筛选集合以仅显示“主题13”之后的文档时,它按预期工作。

$match{{
  _id:{$gt:ObjectId('605db89d208db95eb4878556')}
}}

然而,当我尝试使用下面的查询查看“subject 13”(即“subject 6”)之前的文档时,它并没有像我预期的那样工作。

$match{{
      _id:{$lt:ObjectId('605db89d208db95eb4878556')}
    }}

我得到的不是结果中的“主题6”,而是以下内容。

我怀疑这是因为mongodb总是在排序之前过滤文档,而不管聚合管道中的顺序如何。

请建议我在mongodb中的特定“_id”之前获取文档的方法。

我在集合中有600个文档,这是一个示例数据集。下面是我的完整聚合查询。

[
  {
    '$sort': {
      'overview': 1, 
      '_id': 1
    }
  }, {
    '$match': {
      '_id': {
        '$lt': new ObjectId('605db89d208db95eb4878556')
      }
    }
  }
]

共有1个答案

苏彭薄
2023-03-14

MongoDB优化了查询性能,在您的案例中,将排序移动到末尾,因为您已经将$排序后跟$匹配

https://docs.mongodb.com/manual/core/aggregation-pipeline-optimization/#sort-匹配序列优化

[
  { '$sort': { 'overview': 1, '_id': 1 }  },
  { '$match': { '_id': { '$lt': new ObjectId('605db89d208db95eb4878556') } }
]

优化阶段,优化器将序列转换为以下内容:

[
    { '$match': { '_id': { '$lt': new ObjectId('605db89d208db95eb4878556') } },
    { '$sort': { 'overview': 1, '_id': 1 } }
]

我们可以看到,在执行排序之后,第一阶段是匹配查询。

{
    "stages" : [ 
        {
            "$cursor" : {
                "query" : {
                    "_id" : {
                        "$lt" : ObjectId("605db89d208db95eb4878556")
                    }
                },
                "queryPlanner" : {
                    "plannerVersion" : 1,
                    "namespace" : "video.data3",
                    "indexFilterSet" : false,
                    "parsedQuery" : {
                        "_id" : {
                            "$lt" : ObjectId("605db89d208db95eb4878556")
                        }
                    },
                    "winningPlan" : {
                        "stage" : "FETCH",
                        "inputStage" : {
                            "stage" : "IXSCAN",
                            "keyPattern" : {
                                "_id" : 1
                            },
                            "indexName" : "_id_",
                            "isMultiKey" : false,
                            "multiKeyPaths" : {
                                "_id" : []
                            },
                            "isUnique" : true,
                            "isSparse" : false,
                            "isPartial" : false,
                            "indexVersion" : 2,
                            "direction" : "forward",
                            "indexBounds" : {
                                "_id" : [ 
                                    "[ObjectId('000000000000000000000000'), ObjectId('605db89d208db95eb4878556'))"
                                ]
                            }
                        }
                    },
                    "rejectedPlans" : []
                }
            }
        }, 
        {
            "$sort" : {
                "sortKey" : {
                    "overview" : 1,
                    "_id" : 1
                }
            }
        }
    ],
    "ok" : 1.0
}
 类似资料:
  • 我想从ElasticSearch的结果文档中排除一个字段。我浏览了ElasticSearch.org的这个文档http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-fields.html但当我尝试时,这不起作用。我在SO上看到了同样的问题。有没有办法在Elasticsearch查询中

  • 我是新的MongoDB,并试图从数据库检索单个文档的大小。 数据库名为“”集合名为“” 我试过: 我也尝试过: 但它只返回。如何获取文档的大小?非常感谢。

  • 如何从MongoDB中的集合中随机获取单个文档。 我如何修复代码。 我收到错误:未定义不是函数 --------------------------------------好的。我修复了----------------------------

  • 在我们仔细处理之后。我仍然无法获取自动生成的文档ID。没有“then”选项。我的代码: 创建后如何获取ID?

  • 我有一个索引(名称:“index1”)指向ElasticSearch中的多个文档。 文档的格式(json)是- 下面是映射- 我在ES查询中哪里做错了?

  • 问题内容: 从最近6小时开始搜寻,但没有任何解决方法。请帮我。Elasticsearch ID为:2、4、7、8、11、15、15、16,.... 我的当前文档ID为11,然后如何获取下一个ID为15,上一个ID为8。 谢谢 问题答案: 您可以运行两个查询,一个查询下一个ID,一个查询前一个ID。 下一个ID的查询是: 而先前ID的查询为:

  • 我需要更新Mongo DB中另一个文档内的数组中的一个文档

  • 问题内容: 我正在尝试使用websocket将数据从node.js / MongoDB实例“流式传输”到客户端。一切都很好。 但是,如何确定结果中的最后一个文档?我正在使用node-mongodb-native从node.js连接到MongoDB。 一个简化的例子: 问题答案: 由于mongodb objectId包含创建日期,因此您可以按ID,降序排序,然后使用limit(1): 注意:我一点都