使用文档数组中的in子句进行复杂聚合查询

时间:2017-01-22 07:59:42

标签: mongodb mongodb-query aggregation-framework

以下是user集合的示例MongoDB数据模型:

{
    "_id": ObjectId('58842568c706f50f5c1de662'),
    "userId": "123455",
    "user_name":"Bob"
    "interestedTags": [
        "music",
        "cricket",
        "hiking",
        "F1",
        "Mobile",
        "racing"
    ],
    "listFriends": [
        "123456",
        "123457",
        "123458"
    ]
}

listFriends是其他用户的userId数组

对于特定的userId,我需要提取listFriendsuserId),对于那些userId,我需要汇总interestedTags和他们的数量。

我可以通过将查询分为两部分来实现这一目标:

1。)提取特定listFriends的{​​{1}},

2。)在userId函数中使用此列表,如下所示

aggregate()

我正在尝试解决这个问题:有没有办法在单个聚合函数中实现上述功能(步骤1和2)?

1 个答案:

答案 0 :(得分:0)

您可以使用$lookup查找朋友文档。这个阶段通常用于连接两个不同的集合,但它也可以在一个集合上加入,在你的情况下我认为应该没问题:

db.user.aggregate([{
  $match: {
    _id: 'user1',
  }
}, {
  $unwind: '$listFriends',
}, {
  $lookup: {
    from: 'user',
    localField: 'listFriends',
    foreignField: '_id',
    as: 'friend',
  }
}, {
  $project: {
    friend: {
      $arrayElemAt: ['$friend', 0]
    }
  }
}, {
  $unwind: '$friend.interestedTags'
}, {
  $group: {
    _id: '$friend.interestedTags',
    count: {
      $sum: 1
    }
  }
}]);

注意:我使用$lookup$arrayElemAt只能在Mongo 3.2或更新版本中使用,因此请在使用此管道之前检查您的Mongo版本。