Mongodb &引用;“外连接”;不带ref的父级

Mongodb &引用;“外连接”;不带ref的父级,mongodb,mongoose,mongoose-populate,Mongodb,Mongoose,Mongoose Populate,我有以下猫鼬模型(节选): 我有一条快捷路线,向用户显示杂志列表: let magazines = await Magazine.find(); if (!magazines) return next(err); res.render('magazines', { magazines: magazines }); 在这个路径中,如果用户订阅了杂志,我想加入订阅的杂志 在sql中,这将是一个外部联接 select * from magazines outer join subscripti

我有以下猫鼬模型(节选):

我有一条快捷路线,向用户显示杂志列表:

let magazines = await Magazine.find();
if (!magazines) return next(err);

res.render('magazines', {
  magazines: magazines
});
在这个路径中,如果用户订阅了杂志,我想加入订阅的杂志

在sql中,这将是一个外部联接

select *
from magazines
outer join subscriptions
  where subscriptions.magazine_id = magazine.id
    and owner_id = $current_user_id
StackOverflow的其他问题/答案假定子架构(
杂志
)将有一个
\u创建者
引用到
订户
。但事实并非如此。订阅者和杂志是他们自己的实体,他们不应该相互直接引用,只有通过
订阅
有许多直通模式


我在猫鼬里怎么做?

< P>这就是我所说的“天真”的方法,做两个查询,然后用普通的JavaScript将它们组合在一起。

  let magazines = await Magazine.find().lean();
  if (!magazines) return next(err);

  if (req.user) {
    let subscriptions = await Subscription.find({owner: req.user}).lean();
    let subscriptionsLookup = _.keyBy(subscriptions, 'magazine');
    magazines.forEach((magazine) => {
      if (magazine._id in subscriptionsLookup) {
        magazine.subscription = subscriptionsLookup[magazine._id];
      }
    });
  }

res.render('magazines', {
  layout: false,
  magazines: magazines
});
现在,视图可以检查用户是否已订阅杂志


我觉得这种做法很严厉。我将此作为答案提交,因为这是一个答案。我不希望这是最好的答案。这正是我目前所采用的方法。

对于外部连接,这里可以使用MongoDB的聚合框架来解决您的问题。请参考这个
  let magazines = await Magazine.find().lean();
  if (!magazines) return next(err);

  if (req.user) {
    let subscriptions = await Subscription.find({owner: req.user}).lean();
    let subscriptionsLookup = _.keyBy(subscriptions, 'magazine');
    magazines.forEach((magazine) => {
      if (magazine._id in subscriptionsLookup) {
        magazine.subscription = subscriptionsLookup[magazine._id];
      }
    });
  }

res.render('magazines', {
  layout: false,
  magazines: magazines
});