mongodb - 当foreignField在嵌套数组中时的$lookup
问题描述
我有两个系列:
学生
{
_id: ObjectId("657..."),
name:'abc'
},
{
_id: ObjectId("593..."),
name:'xyz'
}
图书馆
{
_id: ObjectId("987..."),
book_name:'book1',
issued_to: [
{
student: ObjectId("657...")
},
{
student: ObjectId("658...")
}
]
},
{
_id: ObjectId("898..."),
book_name:'book2',
issued_to: [
{
student: ObjectId("593...")
},
{
student: ObjectId("594...")
}
]
}
我想加入一个存在于Library集合中对象字段的issue_to数组中的Student集合。
我想对学生收藏进行查询以获取学生数据以及图书馆收藏,如果学生存在或不存在,则将检查issued_to数组,否则获取图书馆文档。我试过 $lookup 的 mongo 3.6 但我没有成功。
db.student.aggregate([{$match:{_id: ObjectId("593...")}}, $lookup: {from: 'library', let: {stu_id:'$_id'}, pipeline:[$match:{$expr: {$and:[{"$hotlist.clientEngagement": "$$stu_id"]}}]}])
但它会引发错误,请在这方面帮助我。我还查看了在 stackoverflow 上提出的其他问题,例如。stackoverflow 上的问题,stackoverflow 上的 question2但这些是简单的字段而不是对象数组。请帮我
解决方案
我不确定我是否完全理解您的问题,但这应该可以帮助您:
db.student.aggregate([{
$match: { _id: ObjectId("657...") }
}, {
$lookup: {
from: 'library',
localField: '_id' ,
foreignField: 'issued_to.student',
as: 'result'
}
}])
如果您只想获得book_name
每个学生的 all ,您可以这样做:
db.student.aggregate([{
$match: { _id: ObjectId("657657657657657657657657") }
}, {
$lookup: {
from: 'library',
let: { 'stu_id': '$_id' },
pipeline: [{
$unwind: '$issued_to' // $expr cannot digest arrays so we need to unwind which hurts performance...
}, {
$match: { $expr: { $eq: [ '$issued_to.student', '$$stu_id' ] } }
}, {
$project: { _id: 0, "book_name": 1 } // only include the book_name field
}],
as: 'result'
}
}])
推荐阅读
- c# - 如何为输入变量值简化此 Switch 语句?
- matlab - 如何线性索引蒙版图像
- asp.net-core - 在启动时使用 IOptions 进行 aspnet 核心依赖注入
- python - 在 Python 中使用 itertools 时出错
- c - 无法正确使用 C 中的 scanf() 将字符串作为结构的输入
- php - 作曲家供应商公开副本没有为我的 silverstrip 模块选择正确的名称
- mysql - 在查询字符串中传递多个 id,并在节点 js 中的 mysql 中为它们获取数据
- python - 如何解决:摆脱 \n'] 会破坏我的输出?
- delphi - Delphi Devart SecureBridge POST 请求
- python - Python UDP连接多台服务器