如何根据查询参数过滤MongoDB中的对象数组?

时间:2019-12-11 11:24:53

标签: node.js mongodb aggregation-framework

我的收藏夹里有这些文件:

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

您对我如何实现它有任何建议吗?

1 个答案:

答案 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 }
  }
 ])