【问题标题】:Understanding find in Node/Mongo了解 Node/Mongo 中的 find
【发布时间】:2017-07-07 10:09:12
【问题描述】:

我正在尝试学习节点。 考虑这段代码(基于官方 MongoDB Node.js 驱动)

  // Retrieve all the documents in the collection
  collection.find().toArray(function(err, documents) {
    assert.equal(1, documents.length);
    assert.deepEqual([1, 2, 3], documents[0].b);

    db.close();
  });

我有两个问题:

  • find 是同步的还是异步的?
  • 如果它是异步的,.toArray 函数调用会让我感到困惑,因为通常我会期望类似

    collection.find(function(err, results){});
    

我特别感兴趣什么机制允许你在异步函数的结果上调用.toArray?因为我得到的异步函数很少返回一些东西(我认为除了承诺),而是调用传递给它们的回调。有人可以用 find 和 .toArray 澄清这种情况吗?


例如在这个问题的接受答案中:How to get a callback on MongoDB collection.find(),你可以看到作者以我想象的方式调用find,并在回调函数中收到cursor。这对我来说很好,这就是我期望它的工作方式。 但是chaining异步调用find的结果(如果它是异步的?),toArray有点让我困惑。

我的猜测是find返回一个句柄之类的东西,此时数据还没有从DB加载,只有当你调用toArray时实际数据到达。我说的对吗?

【问题讨论】:

  • 这种混乱是否来自 API 更改? v2.2 中的find 返回一个带有各种方法的CursortoArray 是其中之一)。在 v1.4 中,find 接受多个参数,其中一个是可选的 callback(同时仍返回 cursor)。
  • @forrert 是的,这也是造成混乱的因素。那么在2.2中find同步返回游标对象呢?
  • 正如下面的答案很好地指出的那样,在这两种情况下,游标都是同步返回的。请记住,异步运行某些内容的函数仍然可以返回某些内容(例如光标)。游标函数也期望回调接收查询结果。

标签: javascript node.js mongodb


【解决方案1】:

我承认,这个案子有点奇怪。这是mongodb-native的v2.2。

首先,findtwo different usages。您可以提供或不提供回调函数。但在任何情况中,它同步返回一个对象。更准确地说,它是cursor。 我们可以在传递回调时期望异步机制,但这里不是。

collection.find({ }, function (err, cursor) {
  assert(!err);
});
console.log('This happens after collection.find({ }, callback)');

const cursor = collection.find({});
console.log('Also happening after');

另一方面,toArray 是一个异步函数,也有两种不同的用法。这一次,返回的对象因参数而异。

等价:

cursor.toArray(function (err, documents) {
  assert.equal(1, documents.length);
});

cursor.toArray()
  .then(documents => {
    assert.equal(1, documents.length);
  });

在第一次调用中,toArray 返回 undefined,而在第二次调用中,它返回 Promise

【讨论】:

    猜你喜欢
    • 2014-07-29
    • 1970-01-01
    • 2012-09-12
    • 2015-10-07
    • 2019-04-15
    • 2021-08-28
    • 2016-03-21
    • 2014-08-11
    • 2012-12-11
    相关资源
    最近更新 更多