gpt4 book ai didi

mongodb - $lookup 的 Foreign 字段可能是嵌套文档的字段?

转载 作者:可可西里 更新时间:2023-11-01 10:01:53 25 4
gpt4 key购买 nike

$lookup用于对同一数据库中的未分片集合执行左外连接,以过滤来自“已连接”集合的文档,以便在 Mongo 中进行处理。

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

foreignField 可以是from 集合的嵌套文档的字段吗?

例如,有如下两个集合。

历史合集

 [{
id:'001',
history:'today worked',
child_id:'ch001'
},{
id:'002',
history:'working',
child_id:'ch004'
},{
id:'003',
history:'now working'
child_id:'ch009'
}],

childsgroup 集合

[{
groupid:'g001', name:'group1'
childs:[{
id:'ch001',
info:{name:'a'}
},{
id:'ch002',
info:{name:'a'}
}]
},{
groupid:'g002', name:'group1'
childs:[{
id:'ch004',
info:{name:'a'}
},{
id:'ch009',
info:{name:'a'}
}]
}]

那么,这个聚合代码可以这样执行吗?

db.history.aggregate([
{
$lookup:
{
from: "childsgroup",
localField: "child_id",
foreignField: "childs.$.id",
as: "childinfo"
}
}
])

所以我想得到这样的结果。

     [{
id:'001',
history:'today worked',
child_id:'ch001',
childinfo:{
id:'001',
history:'today worked',
child_id:'ch001'
}
}, .... ]

这不可能吗?

最佳答案

$lookup 没有位置运算符,但您可以在 MongoDB 3.6 中使用自定义 pipeline 来定义自定义连接 conditions :

db.history.aggregate([
{
$lookup: {
from: "childsgroup",
let: { child_id: "$child_id" },
pipeline: [
{ $match: { $expr: { $in: [ "$$child_id", "$childs.id" ] } } },
{ $unwind: "$childs" },
{ $match: { $expr: { $eq: [ "$childs.id", "$$child_id" ] } } },
{ $replaceRoot: { newRoot: "$childs" } }
],
as: "childInfo"
}
}
])

首先添加了 $match 以提高性能:我们只想从 childsgroup 中找到那些包含匹配 child_id 的文档,然后我们可以匹配$unwind 阶段之后的子文档。

关于mongodb - $lookup 的 Foreign 字段可能是嵌套文档的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52472654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com