while循环中的mongoose查询不起作用

时间:2018-03-29 08:42:27

标签: node.js mongodb mongoose

我在节点js app中为mongodb集合创建了自己的主键。为了确保生成的密钥是唯一的,我必须检查该生成密钥的集合是否已经存在。这是代码,但由于同步调用而无效:

let id = makeid()
let unique = false
$this = this
while(!unique) {

    try {
    property.findById(id, 'proptype', function (error, property) {
        if (error) { 
             console.log('not found, generated key is unique')
            $this.unique = true
        } else {
            $this.unique = false
            $this.id = makeid()
        }
      })
    } catch(e) 
    {
        console.log('exception: ' + e)
    }
}

如何解决此问题?我正在寻找工作代码的答案。会发生什么,它变成无限循环,每个循环重复执行查询。

2 个答案:

答案 0 :(得分:1)

试试这个

const uniqueCheck = async () => {
    let id = makeid();
    let unique = false
    $this = this
    while (!unique) {
        try {
            const property = await (property.findById(id, 'proptype').exec());
            if (property) {
                $this.unique = false;
                $this.id = makeid();
            } else {
                $this.unique = true
            }
        } catch (e) {
            console.log('exception: ' + e);
            $this.unique = true
        }
    }
}

答案 1 :(得分:0)

你应该使用objectId:

var ObjectID = require('mongodb').ObjectID;

并生成使用:new ObjectID()

碰撞概率非常低: document