链接猫鼬查询并在Schema中返回结果

时间:2018-12-10 11:11:43

标签: javascript node.js mongodb mongoose

我不确定我是否遇到麻烦,因为我不了解JS或mongodb / mongoose。

这是我当前的代码:

/**
 * Fins all (biological) siblings of this person.
 * @returns {Array} Returns all the siblings as a list. If no siblings were found, returns an empty list.
 */
personSchema.methods.getSiblings = function () {
    const sibs = new Set();

    this.model('Person').findById(this.mother, function(err, mom) {
        mom.children.forEach((child) => { sibs.add(child); });
    });

    this.model('Person').findById(this.father, function(err, pa) {
        pa.children.forEach((child) => { sibs.add(child); });
    });

    console.log(sibs);
    return sibs;
}

我希望此功能可以从此人的父母中获取所有孩子,并以列表的形式返回其ID(有效地返回此人的生物学同胞)。现在,此函数将返回的唯一内容是一个空集。我想我理解原因,这是因为该函数在返回之前不等待查询完成。但是我该如何实现呢?我知道我可以使用Promise,但是即使母亲查询返回错误,我也想添加父亲的孩子。

感谢您的帮助!

PS:有没有更好的方法将列表的所有元素添加到集合中?

编辑:我找到了一个解决方案,但这可能不是最佳选择:

/**
* Finds all biological siblings of this person.
 * @param callback(sibs) the function to call when finished. Sets the sibs parameter of the callback function to a list
 * of sibling IDs or an empty list if no siblings were found.
 */
personSchema.methods.getSiblings = function (callback) {

const self = this;
const mId = this.mother;
const pId = this.father;
const sibs = [];

self.model('Person').findById(mId, "children", function (err, res) {
    if (!err)
        sibs.push(res.children);

    self.model('Person').findById(pId, "children", function (err, res) {
        if (!err)
            sibs.push(res.children);

        callback(_.uniqWith(sibs, _.isEqual));
    })
});

}

0 个答案:

没有答案