Mongodb使用输入数组聚合

Posted

技术标签:

【中文标题】Mongodb使用输入数组聚合【英文标题】:Mongodb aggregate by using input array 【发布时间】:2020-12-31 05:52:06 【问题描述】:

我正在努力为我的 MongoDB 数据库创建聚合查询。

这是我的输入数组

recipients = [1,2,7]

这是我的数据库集合


    "chapter": 1,
    "targets": [
      
        type: 'user',
        recipient: 1
      
    ]
  ,
  
    "chapter": 1,
    "targets": [
      
        type: 'user',
        recipient: 2
      
    ]
  ,
  
    "chapter": 2,
    "targets": [
      
        type: 'user',
        recipient: 3
      
    ]
  ,
  
    "chapter": 3,
    "targets": [
      
        type: 'user',
        recipient: 4
      
    ]
  ,

想要的输出

should be [] because 7 doesn't exist in targets.recipient in the collection

这是我迄今为止尝试过的

db.collection.aggregate([
  
      $match: 
        'targets.recipient':  $in: recipients ,
      ,
    
])

任何建议,谢谢。

【问题讨论】:

嗨,您是否需要所有输入数组一次出现在文档中,例如。 [1,2,7]?如果 1,2 匹配,则查询将返回文档,因为存在 1,2 个元素。 【参考方案1】:

$in 的工作方式是,如果文档的值与作为参数传递的数组之间存在任何匹配,它会返回文档。在您的情况下,您可以使用 $in 进行初始过滤,但是只有当结果集包含输入数组中的所有值时,您才希望返回结果。为了实现它,您可以使用$group 获取所有匹配结果,然后应用$all:

db.collection.aggregate([
    
        $match:  "targets.recipient":  $in: [1,2,7]  
    ,
    
        $group: 
            _id: null,
            docs:  $push: "$$ROOT" 
        
    ,
    
        $match:  "docs.targets.recipient":  $all: [1,2,7]  
    
])

Mongo Playground

【讨论】:

【参考方案2】:
// only matched documents will be shown.
> db.targets.aggregate([ $match:"targets.recipient":$in:[1,2,7], $project:chapter:1,targets:1 ]).pretty();

        "_id" : ObjectId("5f5de14c598d922a1e6eff4d"),
        "chapter" : 1,
        "targets" : [
                
                        "type" : "user",
                        "recipient" : 1
                
        ]


        "_id" : ObjectId("5f5de14c598d922a1e6eff4e"),
        "chapter" : 1,
        "targets" : [
                
                        "type" : "user",
                        "recipient" : 2
                
        ]

>

【讨论】:

以上是关于Mongodb使用输入数组聚合的主要内容,如果未能解决你的问题,请参考以下文章

mongodb Aggregation聚合操作之$facet

Mongodb聚合数组大小大于匹配[重复]

Mongodb聚合数组大小大于匹配[重复]

MongoDB:使用正则表达式聚合数组元素

MongoDB 实用数组聚合操作 (2)

mongodb aggregate