1

我尝试在 javascript 中使用 mongoose 过滤来自 mongodb 的一些结果数据。

这是我的 json 结构:

{
  "name": "john",
  "firstname": "doe",
  "yearold": 22,
  "recipes": [
    {
      "title": "cheesecake",
      "data": [
        {    
          "name": "egg",
          "label": "Eggs for",
          "value": 6,
          "unit": "piece"
        },
        {          
          "name": "oil",
          "label": "Specific oil",
          "unit": "oz",
          "value": 0.2
        },
        {          
          "name": "flour",
          "label": "Wholemel flour",
          "value": 450,
          "unit": "gr"
        }
      ]
    },
    {
      "title": "cake",
      "data": [
         {    
          "name": "egg",
          "label": "Eggs for",
          "value": 6,
          "unit": "piece"
        },
        {          
          "name": "flour",
          "label": "Wholemel flour",
          "value": 500,
          "unit": "gr"
        },        
      ]
    }
  ]
}

在某些情况下,我需要返回隐藏一些值的 json 数据。例如我有一个列表,指定所有要隐藏的值

hidekeys=["egg"];

我想得到这个:

{
      "name": "john",
      "firstname": "doe",
      "yearold": 22,
      "recipes": [
        {
          "title": "cheesecake",
          "data": [
            {    
              "name": "egg",
              "label": "Eggs for",
              "value": #######,
              "unit": "piece"
            },
            {          
              "name": "oil",
              "label": "Specific oil",
              "unit": "oz",
              "value": 0.2
            },
            {          
              "name": "flour",
              "label": "Wholemel flour",
              "value": 450,
              "unit": "gr"
            }
          ]
        },
        {
          "title": "cake",
          "data": [
             {    
              "name": "egg",
              "label": "Eggs for",
              "value": #######,
              "unit": "piece"
            },
            {          
              "name": "flour",
              "label": "Wholemel flour",
              "value": 500,
              "unit": "gr"
            },        
          ]
        }
      ]
    }

对于每个配方,如果在 hidekeys 中指定,我需要隐藏成分值。

我用 $project 和 $cond 尝试了一些东西,但它不起作用

4

2 回答 2

1

这是如何使用$map实现此目的的快速方法

const hidekeys = ["egg"];
db.collection.aggregate([
  {
    $addFields: {
      recipes: {
        $map: {
          input: "$recipes",
          as: "recipe",
          in: {
            $mergeObjects: [
              "$$recipe",
              {
                data: {
                  $map: {
                    input: "$$recipe.data",
                    as: "datum",
                    in: {
                      "$mergeObjects": [
                        "$$datum",
                        {
                          $cond: [
                            {
                              "$setIsSubset": [
                                [
                                  "$$datum.name"
                                ],
                                hidekeys
                              ]
                            },
                            {
                              value: "#####"
                            },
                            {
                              value: "$$datum.value"
                            }
                          ]
                        }
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

蒙戈游乐场

于 2021-05-04T15:55:17.560 回答
0

有一种方法可以忽略 hidekeys 和 datum.name 之间的大小写吗?

于 2021-05-05T07:04:16.633 回答