0

I've got these documents in my collection:

{
    "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"]
    }]
  }

At the moment I'm filtering records by header, headerNum, meta.content, meta.contentNum and meta.tags. Below you can see my aggregation pipeline:

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 }
      }
    ]);

What I would like to achieve is to narrow down the number of items in meta array. If req.query.search = 'forskn' I would like to look for this value in meta.content, meta.contentNum, meta.tags and finally receive something like this:

{
    "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"]
     }]
}

Do you have any suggestion on how I can achieve it?

1 Answer 1

1

Try this code

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 }
  }
 ])
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you a lot. This is working exactly as expected. The only difference is that I removed second $unwind, because it gave me multiple duplicates. Thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.