mongoose 如何在Mongodb和NodeJS中使用where条件按_id联接两个集合

vx6bjr1n  于 2022-12-29  发布在  Go
关注(0)|答案(3)|浏览(160)

我有两个集合叫做user和subscription,每个subscription都有user_id,这是用户集合的id,我如何通过where条件和is_account_active = 1连接这两个集合?
请检查下面的代码,我正在使用:

const users = await User.find({ is_account_active: 1 });

这将让我所有的用户有是_帐户_活动标志为1,但在同一时间,我想订阅的详细信息也与各自的用户ID。

2sbarzqh

2sbarzqh1#

您可以在下面查询。

const users = await User.aggregate([
  {
    $match: {
      your_condition
    }
  },
  {
    $lookup: {
      from: 'subscriptions', // secondary db
      localField: '_id',
      foreignKey: 'user_id',
      as: 'subscription' // output to be stored
    }
  }
]);

但是,如果您可以在主集合中使用一个新字段(如user_id),并且可以在该字段上使用自动增量(现在将自动插入具有新的唯一ID的新数据),而不是使用**_id**作为外部字段,那么情况会更好,并且您可以在该字段上创建索引以加快查询执行速度。

41ik7eoe

41ik7eoe2#

你可以使用aggregate函数,如果你把user_id作为字符串,并且你有mongo db版本〉= 4.0,那么你可以把_id转换成字符串(因为_id是一个ObjectId类型):

const users = await User.aggregate([
  {
    $match: {
      is_account_active: 1
    }
  },
  {
    $project: {
      "_id": {
        "$toString": "$_id"
      }
    }
  },
  {
    $lookup: {
      from: 'subscriptions',     //collection name
      localField: '_id',
      foreignKey: 'user_id',
      as: 'subscription'.        //alias
    }
  }
]);

但是,在订阅模式中将user_id存储为对象id是一个更好的主意

user_id: {
    type: mongoose.Schema.Types.ObjectId,
    ref:'User'
}

那么

const users = await User.aggregate([
  {
    $match: {
      is_account_active: 1
    }
  },
  {
    $lookup: {
      from: 'subscriptions',     //collection name
      localField: '_id',
      foreignKey: 'user_id',
      as: 'subscription'.        //alias
    }
  }
]);

More about ObjectId
More about Aggregate function

bq9c1y66

bq9c1y663#

我现在正在使用Mongodb,Mathon的回答非常棒,我没有足够的信誉点在评论中说明这一点:我认为在“as”后面有一个离散的句号,参数foreignKey应该是foreignField --至少Mongodd 6.0.3在使用它和NodeJS时出现了一个错误。

const users = await User.aggregate([
  {
    $match: {
      is_account_active: 1
    }
  },
  {
    $project: {
      "_id": {
        "$toString": "$_id"
      }
    }
  },
  {
    $lookup: {
      from: 'subscriptions',     //collection name
      localField: '_id',
      foreignField: 'user_id',
      as: 'subscription'        //alias
    }
  }
]);

相关问题