【问题标题】:MongoDB cursor contains retrieved documents before iterating over it?MongoDB游标在迭代之前包含检索到的文档?
【发布时间】:2021-01-17 02:24:33
【问题描述】:

当我执行find 方法并且我有一个游标时,游标包含在迭代之前检索到的文档?

我有这个方法:

public async Task<Post> GetPostByIdAsync(ObjectId id, CancellationToken cancellationToken)
{
    using var cursor = await _Collection.FindAsync(post => post.Id == id, cancellationToken: cancellationToken);
    return await cursor.SingleAsync(cancellationToken);
}

首先,我调用返回游标的FindAsync,然后调用返回文档的SingleAsync。我对此有一些疑问。

  • 在什么时候执行查询?当我拨打FindAsync 或拨打SingleAsync 时?
  • 当我执行find 方法并且我有一个游标时,游标包含在迭代之前检索到的文档?
  • 如果我有一个包含 100 个文档的游标,但我只遍历前 20 个文档,是否会从服务器查询和检索其他 80 个文档?
  • 为什么获取游标和迭代游标是两个异步操作?
public async Task<Post> GetPostByIdAsync(ObjectId id, CancellationToken cancellationToken)
{
    var query = _Collection.AsQueryable().Where(post => post.Id == id);
    return await query.SingleAsync(cancellationToken);
}
  • 如果我因为想使用 LINQ 而调用AsQueryable,我只有一种异步方法。是否有任何服务器操作运行同步并阻塞线程?
  • 我看到IMongoQueryable&lt;T&gt;IAsyncCursorSource&lt;T&gt; 的子类型。光标和光标源有什么区别?

【问题讨论】:

    标签: mongodb mongodb-query mongodb-.net-driver


    【解决方案1】:

    当发出查找并且结果集超过默认(或指定)批量大小时,对查找的响应包括:

    • 第一批文件
    • 用于检索下一批的光标 ID

    如果您知道您只会处理一定数量的文档,请使用 limit 将结果集限制为该数量的文档。

    【讨论】:

    • 但是我的问题是如果我只迭代第一批文档,其他文​​档是从数据库中检索并存储到游标中,还是游标只在批次迭代时检索文档?
    • 第一批在 find 响应中可用,无需进一步操作。
    • D,这不是我的问题。我的问题是关于我只使用例如有六个批次的游标的前三个批次,其他三个批次是否在服务器中查询并通过网络传输?
    • 不,为什么会这样?
    猜你喜欢
    • 2013-08-09
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多