MongoDB: cursor.toArray returns 承诺 { <pending> }

MongoDB: cursor.toArray returns Promise { <pending> }

情况

我写了一个查询:

var results = db.collection('diseases').find({
  'ttl.txt': {
    $regex: data,
    $options: 'i'
  }
}).toArray();

问题

然后我将 results 打印到控制台。

if (results.length > 0) {
  console.log(results);
}

ToArray 方法必须 return 找到文件的数组。但是这个方法return给我这个字符串:Promise { <pending> }.

问题

如何 return 找到的文档数组而不是这个字符串?

PS

到数组:Link to the documentation

给出错误是因为它是一个承诺

var results = db.collection('diseases').find({
    'ttl.txt': {
            $regex: data,
            $options: 'i'
    }
}).lean().then(function (obj) {
    if (!obj) {
            return resolve('not find');
    }

    return resolve(obj);
}).catch(function (err) {


    return reject(err);
});

您收到此错误是因为 find() 方法是异步的,这就是 promise 挂起的原因:它仍在获取。

db.collection('diseases').find({
  'ttl.txt': {
    $regex: data,
    $options: 'i'
  }
}).toArray().then((data) => {
    // Here you can do something with your data
    doSomethingWithTheResult(result)
})

请注意,您的数据在回调中。有关承诺的更多信息,请查看 Promise

根据您的节点版本(我相信是 7.6+),您可以使用类似这样的东西

async function getResults() {
    return db.collection('diseases').find({
        'ttl.txt': {
        $regex: data,
        $options: 'i'
        }
    }).toArray();
}

const results = await getResults();

所以你的代码看起来像同步代码。这里的关键是等待承诺结果的async/await命令。

希望对您有所帮助!

toArray()方法中你写了一个回调函数:

var results = db.collection('diseases').find({
  'ttl.txt': {
    $regex: data,
    $options: 'i'
  }
}).toArray(function(err, result) {
     if (results.length > 0) {
       console.log(results);
     }
});

使用 async/await 的现代方法。 在这种情况下,我们希望在鸟类集合中获得匹配的鸟类颜色。

async function getBirdsByColor(color) {
    try {
        var birds = await db.collection('birds').find({
            color: color
        }).toArray()

        if(!birds || !birds.length) {
            throw('No birds with color: ' + color)
        }
        console.log('Successfully found one or more birds:', birds)
    } catch (e) {
        console.log('Bird search failure: ', e)
    }
}