因此,我有一个用于保存文章的集合,该集合中的关键之一是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();
如果可能的话,我想获得一篇文章以及撰写这篇文章的用户详细信息
答案 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"}}])