【问题标题】:"outer join" parent without ref没有 ref 的“外部连接”父级
【发布时间】:2016-05-03 23:58:52
【问题描述】:

我有以下猫鼬模型(摘录):

var subscriberSchema = new Schema({
  name: String,
  address: String
});
var Subscriber = mongoose.model('Subscriber', subscriberSchema);

var magazineSchema = new Schema({
  title: String
});
var Magazine = mongoose.model('Magazine', magazineSchema);

var subscriptionSchema = new Schema({
  owner: {type: Schema.Types.ObjectId, ref: 'Subscriber'},
  magazine: {type: Schema.Types.ObjectId, ref: 'Magazine'},
  metadata like price, start date, end date: ...
});
var Subscription = mongoose.model('Subscription', subscriptionSchema);

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

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 上的其他问题/答案假定子架构 (magazine) 将具有对 subscriber_creator 引用。但这里不是这种情况。订阅者和杂志是它们自己的实体,它们之间不应有直接的引用,只能通过subscription has-many-through 模型。

我将如何在猫鼬中做到这一点?

【问题讨论】:

  • 对于外连接,这里可以使用 MongoDB 的聚合框架来解决您的问题。请参考这个mongodb.com/blog/post/…

标签: mongodb mongoose mongoose-populate


【解决方案1】:

这是我认为的“幼稚”方法,执行两个查询,然后用纯 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
});

现在视图可以检查杂志是否已被用户订阅。

我觉得这种做法很严厉。我将此作为答案提交,因为它是 an 答案。我不希望这是最好的答案。这只是我目前的方法。

【讨论】:

    猜你喜欢
    • 2012-09-03
    • 1970-01-01
    • 2015-03-17
    • 2023-03-17
    • 2020-06-26
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多