您好,我是 MongoDB 新手。我想获取所有包含帖子创建者的用户详细信息的帖子。我有两个收藏。
用户收藏:
[{
"_id": {
"$oid": "655d897b794e33f8ae0e2377"
},
"name": "kunal",
},
{
"_id": {
"$oid": "655d897b794e33f8ae0e237b"
},
"name": "Amit",
}]
user_posts集合
[{
"_id": {
"$oid": "655d897b794e33f8ae0e2378"
},
"user_id": "655d897b794e33f8ae0e2377",
"post_name": "Test Post Group",
},
{
"_id": {
"$oid": "655d897b794e33f8ae0e2379"
},
"user_id": "655d897b794e33f8ae0e2377",
"post_name": "Test Post Group",
},
{
"_id": {
"$oid": "655d897b794e33f8ae0e237a"
},
"user_id": "655d897b794e33f8ae0e2377",
"post_name": "Test Post 3",
},
{
"_id": {
"$oid": "655d897b794e33f8ae0e237c"
},
"user_id": "655d897b794e33f8ae0e237b",
"post_name": "Test Post Amit",
}]
在 users 集合中,
_id
是 ObjectId
,但在 user_posts 集合中,user_id
不是 ObjectId
。但我不想把 user_id
变成 ObjectId
。
我尝试了以下查询:
db.user_posts.aggregate([
{
'$lookup' : {
'as' : 'user_info',
'from' : 'users',
'foreignField' : '_id',
'localField' : 'user_id'
}
}
]).pretty();
输出:
[
{
"_id": ObjectId("655c3285822c4a52150c30a8"),
"post_name": "Test Post",
"user_id": "655c3285822c4a52150c30a7",
"user_info": []
},
{
"_id": ObjectId("655c3285822c4a52150c30a9"),
"post_name": "Test Post 2",
"user_id": "655c3285822c4a52150c30a7",
"user_info": []
},
{
"_id": ObjectId("655c3285822c4a52150c30aa"),
"post_name": "Test Post 3",
"user_id": "655c3285822c4a52150c30a7",
"user_info": []
}
]
仅当在架构级别将
user_id
设为 ObjectId
时,上述查询才有效。可能需要在运行时查询本身将 user_id
转换为 ObjectId
。谁能帮我解决这个问题吗?
您必须确保值必须是同一类型才能进行匹配/比较。参考:连接集合上的连接条件和子查询
db.user_posts.aggregate([
{
"$lookup": {
"from": "users",
"let": {
user_id: {
$toObjectId: "$user_id"
}
},
"pipeline": [
{
$match: {
$expr: {
$eq: [
"$_id",
"$$user_id"
]
}
}
}
],
"as": "user_info"
}
}
])