有没有一种方法可以对给定的_ids数组执行多个findById操作?

时间:2019-03-24 10:37:29

标签: mongodb mongoose outer-join

我正在使用猫鼬通过React前端与mongo数据库进行交互。

我想允许用户输入_id列表并返回相关条目。在将它们退还之前,我想找每个作者,并确保他们被允许看到。 (最终,我将检查每个对象返回的作者是否不是当前登录的用户,然后禁止返回403。)

提供的某些_id可能在数据库中不存在,但是我仍然想知道具有该ID的条目不存在,而不是什么也不返回。似乎我尝试过的每种方法,如果找不到匹配项,Mongo都会忽略。

例如,如果我使用:

model.find({ '_id': {$in: {*bad_IDvalue1*, *bad_IDvalue2*, *good_IDvalue*}})

我得到一个具有单个条目的数组。我宁愿得到一个数组,其中包含两个“不良”或null条目,它们在有价值的author字段中缺少值,而1个好的条目具有实际的作者。

我的第一个想法是在每个循环中使用外部forEach循环和findByID。然后,我可以检查(!result)是否为假,是否为假,就可以知道并可能出错。然后,我可以验证他们是作者并有权查看它。如果一切正常,则将条目弹出到阵列上并返回到前端。但是forEach会引起奇怪的异步问题,在我完成findByID调用之前,我将把数组推送到该数组。我认为必须有更好的方法。

在SQL中,我可以做一个外部联接。我将使用原始输入数组,并将其与表外部连接。返回的表在输入的无效_id的行中将有一堆空白字段。

我认为.populate可能对我有帮助,但我无法弄清楚。

这是我尝试过的无效的方法:

Card.find({ '_id': { $in: cardIDList }}) //should I use populate instead????
        .then(resCards => {console.log(JSON.stringify(resCards))})  //resCards can be EMPTY if they are all bogus IDs
        .then(resCards => {
            resCards.forEach(resCard => {
                if (!resCard) {  //doesn't work.  Because the returned array doesn't contain a "null" entry
                    console.log("no card")
                    cardIDerrors = true;
                }
                if (resCard.author != req.user.id) {
                    console.log("forbidden")
                    cardIDerrors = true;
                }
            });
        })
...

0 个答案:

没有答案