我目前正在使用mongoDB。
我有一个名为Users
的集合,其中包含以下文档:
{
_id: "5d93f338e602a10a38ad3588",
userID: "1",
email: "[email protected]",
password: "password",
firstName: "Tom",
lastName: "Bombadil"
}
我也有一个名为
Posts
的集合。附带文件:{
_id: "5d93fddce602a10a38ad358a",
postID: "1",
userID: "1",
postContent: "hello world"
}
我可以通过Users的以下$ lookup来“加入”这两个:
{
from: 'Posts',
localField: 'userID',
foreignField: 'useriD',
as: 'usersPosts'
}
我该如何编写查询以获取所述Post的“ postContent”?类似于以下内容:
db.Users.find($lookup : {
from: 'Posts',
localField: 'userID',
foreignField: 'useriD',
as: 'usersPosts'
} : userPosts[0]
最佳答案
您可以通过执行以下操作获得每个用户的postContent
列表;
db.Users.aggregate([
{
$lookup: {
from: "Posts",
localField: "userID",
foreignField: "userID",
as: "usersPosts"
}
},
{
$addFields: {
userPostContents: "$usersPosts.postContent"
}
},
{
$project: {
userID: 1,
userPostContents: 1
}
}
])
在完成
$lookup
之后,您已经知道,我们可以使用postContent
在userPosts
数组中仅使用addFields
字段创建一个数组。将对象数组转换为字符串数组。请参阅mongoplayground上的代码
这将为您提供每个
postContent
的user
列表;[
{
"_id": "5d93f338e602a10a38ad3588",
"userID": "1",
"userPostContents": [
"hello world"
]
}
]
或者,如果您只想获得每个
postContent
中第一个post
的user
,则将您的$project
阶段更改为;{
$project: {
userID: 1,
userPostContent: {
$arrayElemAt: [
"$userPostContents",
0
]
}
}
}
只会得到第一个
postContent
,例如;[
{
"_id": "5d93f338e602a10a38ad3588",
"userID": "1",
"userPostContent": "hello world"
}
]
还要在mongoplayground上进行检查
关于mongodb - 通过mongoDB从$ lookup引用字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58194215/