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

Posted

技术标签:

【中文标题】如何在 Mongodb 中对多个数组使用聚合映射和过滤器【英文标题】:How to use aggregate map and filter for multiple arrays in Mongodb 【发布时间】:2020-08-04 23:32:00 【问题描述】:

这里我有两个数组,

 Usercar = [
            parentId :001
            cars:[
                   _id: 1, name: bmw, color: red,
                   _id: 2, name: Ford, color: black,
                   _id: 3, name: Volkswagen, color: black,
                 ]
              ]


 Userfavorite = 
               [
                  parentId :001,
                  favoriteCars:[1,3] //mongoose.Types.ObjectId
               ]

我想使用 mongodb 聚合显示用户最喜欢的汽车,这是我的代码

let carsId= [1,3];


    $match: 
        parentId :001
    ,
    
        $project:
            cars:
                $filter:

                        input:"$cars",
                        as :'cars',
                        cond: $eq :["$$cars._id", mongoose.Types.ObjectId('1')]
                      //cond: $eq :["$$cars._id", carsId]
                
            
        
    

上面的代码只工作,当传递单个carsId时,我想从Usercar的集合中获取用户最喜欢的Cars详细信息,如何在mongodb聚合中做到这一点?

【问题讨论】:

@neil-lunn 请看一下 UsercarUserfavorite 是在同一个文档中,还是在不同的集合中? 它的独立收藏 【参考方案1】:

可以做到这一点的一种可能的聚合是:

在 Usercar 集合上聚合 从 Userfavorite 集合中查找匹配的文档 如果有多个收藏文档,请将它们合并到一个收藏数组中 减少汽车集合以找到与收藏夹匹配的集合,然后添加到数组中
db.Usercar.aggregate([
  $lookup: 
      from: "Userfavorite",
      localField: "parentId",
      foreignField: "parentId",
      as: "favorite"
  ,
  $set: 
      favorite: 
        $arrayElemAt: [
          $concatArrays: "$favorite.favoriteCars",
          0
        ]
      
  ,
  $addFields: 
      favoriteCarDetails: 
        $filter: 
          input: "$cars",
          cond: 
            $in: [
              "$$this._id",
              "$favorite"
            ]
          
        
      
  
])

Playground

【讨论】:

favoriteCarDetails 为空:( 为什么我们需要 concatArrays ? 您不一定,这只是处理另一个集合中有 2 个匹配文档的可能性。如果只有一个,您可以将其投影或展开以将其从查找的数组中拉出

以上是关于如何在 Mongodb 中对多个数组使用聚合映射和过滤器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MongoDB 中对聚合查询结果进行分页并获得总文档数(Node.js + Mongoose)?

mongodb Aggregation聚合操作之$facet

如何使用 mongodb 聚合添加自定义字段?

如何使用聚合在猫鼬中对文档数组进行分页?

如何在 mongoDB 中使用聚合进行分组?

如何在数组的 mongodb 的子字段中进行聚合和分组?