了解Node / Mongo中的查找

时间:2017-02-17 18:55:48

标签: javascript node.js mongodb

我正在尝试学习节点。 请考虑此代码(基于官方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?因为我得到的异步函数很少返回一些东西(我认为除了promises),而是调用传递给它们的回调。有人可以通过find和.toArray澄清这种情况吗?

例如,在此问题的接受答案中:How to get a callback on MongoDB collection.find(),您可以按我设想的方式看到作者调用find,并在回调函数中收到cursor。这对我很好,这就是我期望它的工作方式。 但链接异步调用find的结果(如果它是异步?),toArray有点混淆了我。

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

1 个答案:

答案 0 :(得分:5)

我承认你,这个案子有点奇怪。这是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