我的收藏夹里有这些文件:
{
"header": "Immaterielle eiendeler",
"headerNum": "10",
"meta": [{
"content": "FoU skattemessig formue",
"contentNum": "1000",
"details": "Denne kontoen brukes til ervervet forskning og utvikling som er balanseført. Hvis dette ikke skal balanseføres, men kostnadføres, opprett en egen kostnadskonto på dette.",
"tags": ["forskning", "utvikling", "ervervet", "immaterielle eiendeler"]
}, {
"content": "FoU ervervet",
"contentNum": "1001",
"details": "For ervervet FoU er det lettere å identifisere eiendelen for balanseføring, ettersom kjøpet forutsetter at eiendelen kan overføres fra selger til kjøper.",
"tags": [""]
}, {
"content": "FoU egenutviklet",
"contentNum": "1005",
"details": "For at immateriell eiendel \"Forskning og Utvikling\" skal kunne balanseføres, må eiendelen være identifiserbar og kunne skilles fra Goodwill.",
"tags": [""]
}]
},
{
"header": "Tomter, bygninger og annen fast eiendom",
"headerNum": "11",
"meta": [{
"content": "Forretningsbygg (saldogruppe i)",
"contentNum": "1100",
"details": "Her bokføres kjøp av bygninger (dvs balanseføres som selskapets eiendel) Byggeningen føres til anskaffelses-/byggekost, og avskrives deretter. Her føres også andre kostnader.",
"tags": ["tomter", "bygninger", "eiendom", "forretningsbygg"]
}, {
"content": "Bygningsmessige anlegg",
"contentNum": "1120",
"details": "Her fører du bygg/anlegg som ikke er fast eiendom. Det kan for eksempel være anleggsbrakker, småbåthavn, anlegg for distribusjon av strøm, anlegg for utvinning av sand o.l.",
"tags": ["brakker", "midlertidig bygg", "bygningsmessige anlegg"]
}]
}
此刻,我正在按 header , headerNum , meta.content , meta.contentNum 过滤记录>和 meta.tags 。在下面,您可以看到我的聚合管道:
const query = req.query.search;
const accounts = await Account.aggregate([
{
$unwind: {
path: '$meta.tags',
preserveNullAndEmptyArrays: true
}
},
{
$match: {
$or: [
{ header: { $regex: query, $options: 'i' } },
{ headerNum: { $regex: query, $options: 'i' } },
{ 'meta.content': { $regex: query, $options: 'i' } },
{ 'meta.contentNum': { $regex: query, $options: 'i' } },
{ 'meta.tags': { $regex: query, $options: 'i' } }
]
}
},
{
$sort: { headerNum: 1 }
}
]);
我想要实现的是缩小元数组中的项目数量。如果req.query.search = 'forskn',我想在 meta.content , meta.contentNum ,中查找此值> meta.tags ,并最终收到如下内容:
{
"header": "Immaterielle eiendeler",
"headerNum": "10",
"meta": [{
"content": "FoU skattemessig formue",
"contentNum": "1000",
"details": "Denne kontoen brukes til ervervet forskning og utvikling som er balanseført. Hvis dette ikke skal balanseføres, men kostnadføres, opprett en egen kostnadskonto på dette.",
"tags": ["forskning", "utvikling", "ervervet", "immaterielle eiendeler"]
}]
}
您对我如何实现它有任何建议吗?
答案 0 :(得分:1)
尝试此代码
Account.aggregate([
{
$unwind: {
path: '$meta',
preserveNullAndEmptyArrays: true
}
},
{
$unwind: {
path: '$meta.tags',
preserveNullAndEmptyArrays: true
}
},
{
$match: {
$or: [
{ header: { $regex: query, $options: 'i' } },
{ headerNum: { $regex: query, $options: 'i' } },
{ 'meta.content': { $regex: query, $options: 'i' } },
{ 'meta.contentNum': { $regex: query, $options: 'i' } },
{ 'meta.tags': { $regex: query, $options: 'i' } }
]
}
},
{$group:{_id:'$_id', headerNum:{$first:'$headerNum'},header:
{$first:'$header'},meta:{$addToSet:'$meta'}}},
{
$sort: { headerNum: 1 }
}
])