在mongoose mongodb中使用sort()同步findOne

时间:2014-02-26 05:07:52

标签: mongodb mongoose

我想查找带有最新“sorting_index”字段的文档。 我这样试试:

var sorting_index = -1;
this.findOne().sort({'sorting_index': -1}).exec(function(err, doc) {   
    if (err) return;
    sorting_index = doc['sorting_index']; // sorting_index == 10      
});                         
console.log(sorting_index); // sorting_index == -1

问题是回调是异步的。如何同步?

3 个答案:

答案 0 :(得分:7)

简短回答 - 你不能。

如果您希望代码同步,则应考虑使用其他工具而不是node.js

node.js中的所有I / O操作都是异步的,因此如果您想使用node.js,那么您应该学习如何处理异步代码:

this.findOne().sort({sorting_index: -1}).exec(function(err, doc) {   
    if (err) throw err;
    var sorting_index = doc['sorting_index'];
    console.log(sorting_index); // sorting_index == 10
});

还有许多有用的工具可以简化异步代码:async.js,promises,ES6生成器(node.js 11.x)等。

答案 1 :(得分:0)

类似于同步的语法示例

尝试使用nvm将版本提升到Node 8+或更高版本,因为它非常棒。当你到达时,转到最新的Node LTS。

尝试类似的方法,让您的生活更轻松,确保将您正在使用的功能标记为async (假设您在课堂上)并使用await你需要获得通常与Promise链接一起使用的实际内容。

async findSortIndex() {
  try {
    const doc = await this.findOne().sort({ sorting_index: -1 })
    console.log(doc.sorting_index)
  } catch(err) {
    return Promise.reject(err)
  }
}

答案 2 :(得分:0)

请谨慎使用await等类似的链接方法。

我有一段类似的代码

const DbModelInstances = await DbModelInstance.find().sort("-dateAdded");

出问题了,由于同步问题,我的单元测试搞砸了。我删除了排序语句,它工作正常。 我只是今天早上才发现它,所以我还没有一个详尽的解释,但是当我遇到这篇文章时,我想我会提到它,以防万一其他人遇到了同样的问题。