我有兩個系列,一個是公司,另一個是專案。我正在嘗試撰寫一個聚合函式,該函式首先獲取所有狀態為“客戶”的公司,然后從那里撰寫一個管道,該管道將回傳所有已過濾的公司,其中 company._id === project.companyId 作為物件陣列. 以下是縮短集合的示例:
Companies
{
_id: ObjectId('2341908342'),
companyName: "Meta",
address: "123 Facebook Lane",
status: "Client"
}
Projects
{
_id: ObjectId('234123840'),
companyId: '2341908342',
name: "Test Project",
price: 97450,
}
{
_id: ObjectId('23413456'),
companyId: '2341908342',
name: "Test Project 2",
price: 100000,
}
聚合后我想要的結果:
Companies
{
_id: ObjectId('2341908342'),
companyName: "Meta",
address: "123 Facebook Lane",
projects: [ [Project1], [Project2],
}
專案欄位目前在公司集合中不存在,所以我想我們必須添加它。我還開始撰寫一個 $match 函式來按客戶過濾,但我不確定這是否正確。我正在嘗試為此使用 $lookup 但無法弄清楚管道。誰能幫我?
我目前陷入困境的地方:
try {
const allClientsWithProjects = await companyCollection
.aggregate([
{
$match: {
orgId: {
$in: [new ObjectId(req.user.orgId)],
},
status: { $in: ["Client"] },
},
},
{
$addFields: {
projects: [{}],
},
},
{
$lookup: { from: "projects", (I am stuck here) },
},
])
.toArray()
感謝您提供的任何幫助。
更新*
我似乎很接近我覺得......這就是我目前所擁有的,它正在回傳所有內容,但 Projects 仍然是一個空陣列。
try {
const allClients = await companyCollection
.aggregate([
{
$match: {
orgId: {
$in: [new ObjectId(req.user.orgId)],
},
status: {
$in: ["Client"],
},
},
},
{
$lookup: {
from: "projects",
let: {
companyId: {
$toString: [req.user.companyId],
},
},
pipeline: [
{
$match: {
$expr: {
$eq: ["$companyId", "$$companyId"],
},
},
},
],
as: "projects",
},
},
])
.toArray()
我的所有公司資訊都為多家公司正確回傳,但該專案 Array 仍然是 []。任何幫助將不勝感激,我仍將對此進行故障排除。
uj5u.com熱心網友回復:
一種選擇是將 a$lookup與管道一起使用:
db.company.aggregate([
{
$match: {
_id: {
$in: [
ObjectId("5a934e000102030405000000")
],
},
status: {
$in: [
"Client"
]
},
},
},
{
$lookup: {
from: "Projects",
let: {
companyId: {
$toString: "$_id"
}
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$companyId",
"$$companyId"
]
}
}
}
],
as: "projects"
}
}
])
看看它在操場上的例子是如何作業的
uj5u.com熱心網友回復:
我的問題的最終答案:
try {
const allClientsAndProjects = await companyCollection
.aggregate([
{
$match: {
orgId: {
$in: [new ObjectId(req.user.orgId)],
},
status: {
$in: ["Client"],
},
},
},
{
$lookup: {
from: "projects",
let: {
companyId: {
$toString: "$_id",
},
},
pipeline: [
{
$match: {
$expr: {
$eq: ["$companyId", "$$companyId"],
},
},
},
],
as: "projects",
},
},
])
.toArray()
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/527089.html
