我正在使用猫鼬通过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;
}
});
})
...