【发布时间】:2021-08-05 05:25:44
【问题描述】:
我的 MongoDB (v.4.4) 中有以下集合:
guilds:
{
_id: String,
members: [{ _id String, rank: number },{ _id String, rank: number }...]
}
和characters:
{
_id: String,
many_other: 'fields'
}
我想通过_id 字段加入$lookup 管道语法guild.members <= characters。
我不使用 Mongo 内置
OjbectIds作为_id,我用两个集合中的字符串覆盖它。正如我所听到的,$lookup与管道中的字符串为_id有一些不同的行为。所以在回答之前,请确保你知道它。
我想要的预期结果很简单,我想从原始文档中保存排名,并从$lookup它添加任何其他字段:
{
_id: String // (guild)
members: [
{
_id: String, // (characters)
rank: number,
many_other: '...fields from characters'
},
{
_id: String, // (characters)
rank: number,
many_other: '...fields from characters'
}, ...
]
Mongo Playground example: avaliable
我尝试了什么:
各种查询,例如:
{
$lookup: {
from: "characters",
pipeline: [
{
$match: {
$expr: { $eq: [ { $toString :"$members._id" }, { $toString : "$$character_id" } ] }
}
}
],
as: "guild_members"
},
}
将 ID 转换为字符串,使用 let 阶段变量,并使用 $map 运算符。但我离要求的结果还很远。
还有一个问题,就是和问题有些相关,但和查询本身无关
如您所见,characters 集合具有many other fields。其中一些非常重,(因为公会最多可以有 500 个成员)这使得结果文档 >16 MB(MongoDB 阈值限制),这会产生错误。因为据我所知,我们无法从joined 文档中选择字段,所以最好在$lookup 阶段或类似的东西之后立即排除它。任何关于它的建议都会非常受欢迎。
【问题讨论】:
标签: javascript mongodb mongoose aggregation-framework