mongodb聚合和过滤数据

Posted

技术标签:

【中文标题】mongodb聚合和过滤数据【英文标题】:mongodb agregate and filter data 【发布时间】:2021-07-26 23:04:08 【问题描述】:

我尝试在 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 尝试了一些东西,但它不起作用

【问题讨论】:

你用的是哪个版本的mongodb? 我使用 mongodb 4.4.3 【参考方案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"
                            
                          ]
                        
                      ]
                    
                  
                
              
            ]
          
        
      
    
  
])

Mongo Playground

【讨论】:

谢谢它的工作!当我们检查 datanum.name 是否是 hidekeys 的子集时,是否可以忽略大写锁定?【参考方案2】:

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

【讨论】:

以上是关于mongodb聚合和过滤数据的主要内容,如果未能解决你的问题,请参考以下文章

MongoDb 聚合基于 ids 过滤列表并将此过滤列表映射到另一个字段

mongoDB应用篇-mongo聚合查询

如何通过将数据作为参数传递以过滤 unix 时间戳来查询具有聚合的 mongodb

mongodb Aggregation聚合操作之$facet

具有特定条件计数的 Mongodb 聚合并按输出投影的日期范围过滤不能按预期工作

如何在 Mongodb 中对多个数组使用聚合映射和过滤器