我有兩個集合:共享和材料。
分享:
{
from_id: 2
to_id: 1
material_id: material1
}
材料:
{
_id: material1
organization_id: 2
},
{
_id: material2
organization_id: 1
},
{
_id: material3
organization_id: 1
},
--Edit: 有3個材料,2個屬于organization_id(1),1個屬于organization_id(2)。organization_id 與 material1 中的 1 不匹配(而是屬于 material2),但在共享集合中,to_id 匹配 1。如果匹配存在,我想找到等于 material_id 的 Material 檔案 _id共享并找到 organization_id 等于 1 的 Material 檔案。
我想檢查共享 (to_id) 中的欄位是否具有等于材料 (organization_id) 中的欄位的值,并檢查 organization_id 是否等于 1。如果其中存在檔案,請再次檢查查找 Material 的 _id 是否等于 Sharing 的 material_id 并回傳所有檔案和總數。
如果沒有相等的值,我想省略該結果并發送僅組織 ID 等于 1 的物件并獲取此結果的總數。
現在,我使用 .map() 以非常低效的方式找到它。下面是我的代碼:
export const getMaterials = async (req, res) => {
const sharing = await Sharing.find({to_id: 1});
let doneLoad;
try {
if (sharing && sharing.length>0) {
const sharingTotal = await Material.find( {$or: [ {organization_id: 1}, {_id: sharing.map((item) => item.material_id)} ] } ).countDocuments();
const sharingMats = await Material.find( {$or: [ {organization_id: 1}, {_id: sharing.map((item) => item.material_id)} ] } );
res.status(200).json({data: sharingMats});
doneLoad= true;
}
else if (!doneLoad) {
const materialTotal = await Material.find({organization_id: 1}).countDocuments();
const materials = await Material.find({organization_id: 1});
res.status(200).json({data: materials});
}
} catch (error) {
res.status(404).json({ message: error.message });
}
}
我曾嘗試使用聚合來獲得我想要的結果,但我找不到任何符合我要求的解決方案。任何幫助都會很棒,因為我對使用 mongodb 還是很陌生。謝謝。
編輯(期望的結果):
Materials: [
{
_id: material1,
organization_id: 1
},
{
_id: material2,
organization_id: 1
},
{
_id: material3,
organization_id: 1
}
]
uj5u.com熱心網友回復:
您可以使用 a 中的子管道$lookup來執行過濾。稍后$addFields使用的計數。$size
db.Sharing.aggregate([
{
"$match": {
to_id: 1
}
},
{
"$lookup": {
"from": "Material",
"let": {
to_id: "$to_id",
material_id: "$material_id"
},
"pipeline": [
{
"$match": {
$expr: {
$or: [
{
$eq: [
"$$to_id",
"$organization_id"
]
},
{
$eq: [
"$$material_id",
"$_id"
]
}
]
}
}
},
{
"$addFields": {
"organization_id": 1
}
}
],
"as": "materialLookup"
}
},
{
"$addFields": {
"materialCount": {
$size: "$materialLookup"
}
}
}
])
這是Mongo游樂場供您參考。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/465223.html
