代码之家  ›  专栏  ›  技术社区  ›  Shrabanee

在记录上使用$unwind后,仅与一条记录匹配

  •  0
  • Shrabanee  · 技术社区  · 6 年前

    我有以下记录

    [
      {
        _id : 1, nm : 1,
        usr:[
             {id : 1, ty : 'team'}, 
             {id : 2, em : 'a'}, 
             {id : 3, em : 'b'}
           ]
      },
      {
        _id : 2, nm : 2,
        usr:[
             {id : 2, em : 'a'}, 
             {id : 3, em : 'b'}
           ]
      },
      {
        _id : 3, nm : 3,
        usr:[
             {id : 1, ty : 'team'}, 
             {id : 3, em : 'b'}
           ]
      },
      {
        _id : 4, nm : 4,
        usr:[ 
             {id : 3, em : 'b'}
           ]
      }
    ]
    
    • 我想数到 3 使用查询时 userAndTeam = [1, 2] ,即如果记录 usr.id as 1 or 2 获取那些记录。
    • 我想数到 2 使用查询时 userAndTeam4 = [1, 4] ,即如果记录 usr.id as 1 or 4 获取那些记录。

    我试过使用 $unwind ,使第一个案例的计数为4,如下所示 $展开 为第一条记录创建了3条记录,以下查询与其中2条记录匹配。

    我尝试的查询:

    var userAndTeam = [1, 2] //User id and team id. Record should match one of the ids.
    var userAndTeam4 = [1, 4]
    
    [{
       $unwind: '$usr'
     },
     {
       $project:{
         'count-2' : {$cond: {
                    if: {$in : ['$usr.id',userAndTeam]},
                    then: 1,
                    else: 0
                }},
          'count-4' : {$cond: {
                    if: {$in : ['$usr.id',userAndTeam4]},
                    then: 1,
                    else: 0
                }}
       }   
     }
    

    ]

    输出 :

    预期的 对于id为2-“count-2”的用户:3

    得到 对于id为2-“count-2”的用户:4

    预期的 对于id为4-“count-4”的用户:2

    得到 对于id为4-“count-4”的用户:2

    有人能指导我解决这个问题并获得预期的计数吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   mickl    6 年前

    您可以尝试以下聚合:

    db.col.aggregate([
        {
            $unwind: "$usr"
        },
        {
            $project:{
                "userId": "$usr.id",
                "count-2": {
                    $cond: {
                        if: { $in: [ "$usr.id", userAndTeam ] },
                        then: 1,
                        else: 0
                    }
                },
                "count-4": {
                    $cond: {
                        if: { $in: [ "$usr.id", userAndTeam4] },
                        then: 1,
                        else: 0
                    }
                }
            }
        },
        {
            $group: {
                _id: "$_id",
                "count-2": { $max: "$count-2" },
                "count-4": { $max: "$count-4" }
            }
        },
        {
            $group: {
                _id: null,
                "count-2": { $sum: "$count-2" },
                "count-4": { $sum: "$count-4" }
            }
        }
    ])
    

    代码中缺少的是 0 1 每个 _id 所以你需要分组 _id号 $max 每组的值 0 如果没有匹配的 1. 如果有任何元素与数组匹配。