如何从对象数组中投影所有嵌套文档?

Posted

技术标签:

【中文标题】如何从对象数组中投影所有嵌套文档?【英文标题】:How to project all nested documents from an array of objects? 【发布时间】:2021-04-16 06:43:43 【问题描述】:

我有这样的文件:


        "_id": "5ffc130e9fb31b26162e0bad",
        "results": [
            
                "customer": 
                    "display_name": "Manno Dispensary - first",
                    "ext_acct_id": "267"
                
            ,
            
                "customer": 
                    "display_name": "Manno Dispensary - second",
                    "ext_acct_id": "262"
                
            ,
            
                "customer": 
                    "display_name": "Kako Dispensary - first",
                    "ext_acct_id": "261"
                
            ,
            
                "customer": 
                    "display_name": "Kako Dispensary - second",
                    "ext_acct_id": "263"
                
            
        ]

我想编写一个 MongoDB 查询,它在 "customer.display_name" 上进行正则表达式搜索,并在满足此条件的结果中返回所有这些文档。

到目前为止,我已经编写了这个查询,它返回了我想要的输出,但问题是,它只是在结果中重新调整了一个文档,我错过了什么吗?

我想要的输出:


            "_id": "5ffc130e9fb31b26162e0bad",
            "results": [
                
                    "customer": 
                        "display_name": "Manno Dispensary - first",
                        "ext_acct_id": "267"
                    
                ,
                
                    "customer": 
                        "display_name": "Manno Dispensary - second",
                        "ext_acct_id": "262"
                    
                
            ]
    

我实际上得到了什么:


                "_id": "5ffc130e9fb31b26162e0bad",
                "results": [
                    
                        "customer": 
                            "display_name": "Manno Dispensary - first",
                            "ext_acct_id": "267"
                        
                    
                ]
        

这是我为获取客户名称中包含“Manno”的所有客户而编写的查询。

我的收藏名称是 Order(mongoose), search="Manno"

Order.find(
      results: 
        $elemMatch : 
          "customer.display_name": $regex: search
        
      
    ,
      results: 
        $elemMatch : 
          "customer.display_name": $regex: search
        
       
    );

【问题讨论】:

【参考方案1】:

$elemMatch$ 将只返回单个匹配的文档/对象表单数组,试试 $filter 和 $regexMatch,

$filter 迭代结果数组的循环 $regexMatch检查正则表达式条件,返回true或false
Order.find(
  results: 
    $elemMatch: 
      "customer.display_name":  $regex: "Manno" 
    
  
,

  results: 
    $filter: 
      input: "$results",
      cond: 
        $regexMatch: 
          input: "$$this.customer.display_name",
          regex: "Manno"
        
      
    
  
)

Playground

【讨论】:

对我不起作用。最后,我更改了数据库架构并进行了新查询

以上是关于如何从对象数组中投影所有嵌套文档?的主要内容,如果未能解决你的问题,请参考以下文章

从与数组上的查询条件匹配的第一个元素中投影特定字段

在 mongodb 中投影集合类型数组的大小

在 C++/OpenGL 中投影一个围绕另一个对象旋转的对象

如何从具有嵌套对象数组的对象数组中获取所有特定值?

从嵌套的对象数组中提取所有特定属性

如何通过匹配 ObjectId 字段从嵌套数组中删除对象