node.js - Mongoose 聚合管道查找和嵌套对象
问题描述
我想和你分享我的问题。
所以我有 3 个实体需要在我的查询中访问:
评估:
[
{
_id: 1,
questionary: 1,
subject: 1
},
{
_id: 1,
questionary: 1,
subject: 2
},
]
用户
[
{
_id: 1
name: "John Doe",
photo: "photo1.jpg"
},
{
_id: 2
name: "Paul Smith",
photo: "photo2.jpg"
},
]
提问的
[
{
_id: 1,
title: "questionary 1",
"date": "2020-02-08T00:00:00.000Z"
},
{
_id: 2,
title: "questionary 2",
"date": "2020-02-09T00:00:00.000Z"
}
]
所以我的目标是获得这样的数据:其中的问题列表,与问题相关的评估列表,以及在评估中我需要一个用户对象。像这样:
[
{
"_id": "1",
"title": "questionary 1",
"evaluations": [
{
"_id": "1",
"date": "2020-04-05T18:53:46.948Z"
"user": {
_id: 1,
"name": "John Doe",
"photo": "photo1.jpg"
}
},
{
"_id": "2",
"date": "2020-04-06T18:53:46.948Z",
"user": {
_id: 1,
"name": "John Doe",
"photo": "photo1.jpg"
}
}
]
}
]
我的查询是:
return await Questionary.aggregate([{
$lookup: {
from: "evaluation",
localField: "_id",
foreignField: "questionary",
as: "evaluations",
}
},
{
$lookup: {
from: "user",
localField: "evaluations.user",
foreignField: "_id",
as: "user",
}
},
{
$project: {
_id: 1,
title: 1,
status: 1,
evaluations: {
_id: 1,
date: 1,
user: "$user"
}
},
},
]);
我的结果是:
[
{
"_id": "1",
"title": "questionary 1",
"evaluations": [
{
"_id": "1",
"date": "2020-04-05T18:53:46.948Z"
"user": [
{
_id: 1,
"name": "John Doe",
"photo": "photo1.jpg"
},
{
_id: 2,
"name": "Paul Smith",
"photo": "photo2.jpg"
}
]
},
{
"_id": "2",
"date": "2020-04-06T18:53:46.948Z",
"user": [
{
_id: 1,
"name": "John Doe",
"photo": "photo1.jpg"
},
{
_id: 2,
"name": "Paul Smith",
"photo": "photo2.jpg"
}
]
}
]
}
]
我的评价的用户正在合并,但这不是我想要的,我只是想要评价里面的用户的内部信息。
有什么建议吗?
解决方案
您应该能够$lookup
通过使用不相关的子查询来使用嵌套,如https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#join-conditions-and-uncorrelated-sub-queries所述
在你的情况下,这将是:
return await Questionary.aggregate([{
$lookup: {
from: "evaluation",
let: {questId: "$_id"},
pipeline: [{
$match: {
$expr: {
$eq: ["$$questId", "$questionary"]
}
},
}, {
$lookup: {
from: "user",
localField: "subject",
foreignField: "_id",
as: "user",
}
}],
as: "evaluations"
}
}
]);
推荐阅读
- ocaml - 将一个函数的列表连接到 OCaml 中的另一个递归函数
- android - Compose 中的椭圆列表
- python - 计数器工作不正常,数一数二
- ionic-framework - 使用相机离子3时如何打开手电筒
- javascript - Websocket 未与 javascript 连接
- c - 如何为以下 CCS IDE MSP432P401R Launchpad 微控制器代码启用 Timer_A0 模块?
- stanford-nlp - 训练斯坦福 CoreNLP 核心参考者
- reactjs - 无法弄清楚为什么 API JSON 对象不会呈现给 React 组件
- qt - qmake 安装一个尚不存在的文件
- javascript - useReducer 不接受数组或状态