mongodb - MongoDB按字段查找对象数组并在结果中保留其他字段
问题描述
我试图弄清楚如何通过特定字段查找对象数组,同时保留与查找字段处于同一级别的其他字段。
我的processes
收藏如下:
{
_id: 'p1',
steps: [
{
_id: 'ps1',
step: 's1',
time: 10
},
{
_id: 'ps2',
step: 's2',
time: 15
}
]
}
该steps
集合看起来像(对于带有 的文档_id: s1
):
{
_id: 's1',
name: 'step 1'
}
我的聚合:
processes.aggregate([
{
// match stage or whatever prior stage
},
{
$lookup: {
from: 'steps',
localField: 'steps.step',
foreignField: '_id',
as: 'steps'
}
}
])
这可行,但基本上会删除与查找字段 ( ) 处于同一级别的steps._id
和字段,如输出所示:steps.time
steps.step
{
_id: 'p1',
steps: [
{
_id: 's1',
name: 'step 1'
},
{
_id: 's2',
name: 'step 2'
}
]
}
虽然预期的输出是:
{
_id: 'p1',
steps: [
{
_id: 'ps1',
time: 10,
stepId: 's1',
name: 'step 1',
},
{
_id: 'ps2',
time: 15,
stepId: 's2',
name: 'step 2',
}
]
}
注意:_id
预期输出中的字段不是很重要,可以包含step
文档的_id,避免有单独的stepId
字段。
编辑
附加问题移至此处:MongoDB lookup array of objects by field (join conditions and uncorrelated sub-queries)
解决方案
经过大量研究,我可以找到实现我在问题中的意思的方法。
主要思想是将两个对象数组合并在一起。
processes.aggregate([
{
// match stage or whatever prior stage
},
{
$lookup: {
from: 'steps',
localField: 'steps.step',
foreignField: '_id',
as: 'steps2'
},
{
$addFields: {
stages: {
$map: {
input: '$steps',
in: {
$mergeObjects: [
'$$this',
{
$arrayElemAt: [
'$steps2',
{
$indexOfArray: ['$steps2._id', '$$this.step'],
},
],
},
],
},
},
},
},
}
}
])
推荐阅读
- nstextfield - Swift 5,NSTextField,controlTextDidChange 给出编译器错误“方法没有覆盖其超类中的任何方法”
- javascript - 我在 Vue.js 项目中作为模块导入导入的图像存在问题
- google-apps-script - 使用 Google App Script 在 Google 表格中编辑单元格时的用户名和时间戳
- javascript - 延迟 jquery 文件会产生不良的视觉效果:这是一个好习惯吗?
- java - 如何配置杰克逊能够反序列化特殊集合?
- java - 需要从 inOrder 和 preOrder 返回 postOrder 树
- parsing - 如果文件以 utf-8 编码打开,0x85 windows 1252 会换行
- javascript - 为什么在函数内部用 let 可访问描述的变量?
- python - whatsapp上的硒阅读重定向
- c++ - std::set 不同的比较器用于插入和排序