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

我不确定我是否遇到麻烦,因为我不懂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;
}

我希望这个功能能让这些人的所有孩子都成为父亲和母亲,并将他们的ids作为清单返回(有效地将这些人归还给生物兄弟姐妹) . 现在这个函数唯一能返回的是空集 . 我想我理解为什么,这是因为函数不会在返回之前等待查询完成 . 但是我如何实现这一目标呢?我知道我可以使用promises,但我想添加父亲的孩子,即使母亲查询返回错误...

谢谢您的帮助!

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)