MongoDB Mongoose:一次调用即可从两个集合中获取数据

时间:2019-11-13 05:01:11

标签: mongodb

因此,我有一个用于保存文章的集合,该集合中的关键之一是userId,我在其中保存了用户集合中的_id。

const articleSchema: Schema = new Schema(
  {
    body: { type: String },
    title: { type: String, required: true },
    subTitle: { type: String, required: true },
    userId: { type: Number, required: true, index: true },
  },
  {
    timestamps: true,
  }
);

当我收到其中一篇文章时,我也想获取存储在用户集合中的用户名和其他信息。


const userSchema: Schema = new Schema(
  {
    email: { type: String, required: true, unique: true, index: true },
    country: { type: String },
    fullName: { type: String, required: true },
    password: { type: String, required: true },
  },
  {
    timestamps: true,
  }
);

我是否必须对数据库进行2次调用,或者是否可以通过某种方式进行一次调用?类似于SQL中的联接

const account = await articleSchema // <-----can I also select the userSchema?
        .findOne(
          { userId }
        )
        .exec();

如果可能的话,我想获得一篇文章以及撰写这篇文章的用户详细信息

3 个答案:

答案 0 :(得分:0)

您可以查看此Lookup

对同一数据库中的未分片集合进行左外部联接,以从“联接”集合中过滤文档以进行处理

{
 $lookup:
 {
   from: <collection to join>,
   localField: <field from the input documents>,
   foreignField: <field from the documents of the "from" collection>,
   as: <output array field>
 }
}

答案 1 :(得分:0)

您需要在文章架构中放置引用,以便您可以在文章架构中将userId更改为以下内容:

userId: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'userSchema', // put user schema here
    required: true
}

并编写如下查询:

const account = await articleSchema
    .findOne(
      { userId: userId_value_here }
    ).populate('userId', 'email fullName')

它将为您提供带有UserId键中的User对象的Article对象 输出如下:

{
"_id" : ObjectId("5dca81898cc8cc03a4a759b0"),
"__v" : 0,
"body" : "body",
"title" : "title",
"subTitle": "sub title",
"userId": {
              "_id" : ObjectId("5dca81898cc8cc03d56s6ada"),
              "email": "email@email.com",
              "fullName" : "name"
          }
}

答案 2 :(得分:0)

使用查找,它将从用户集合中返回用户的详细信息。

  db.collection('articles').aggregate([{$lookup:{from:"users",localField:"userId",foreignField:"_id", as:"userDetails"}}])