2017-01-22 115 views
0

下面是示例MongoDB的數據模型的一個user集合:複雜聚合查詢

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

listFriendsuserId爲其他用戶的陣列

對於特定userId我需要提取listFriendsuserId的)和那些userId的我需要聚合interestedTags和他們的計數。

我將能夠通過將查詢實現爲兩個部分是:

1)提取listFriends特定userId

2)在aggregate()功能,一些使用此列表這樣

db.user.aggregate([ 
    { $match: { userId: { $in: [ "123456","123457","123458" ] } } }, 
    { $unwind: '$interestedTags' }, 
    { $group: { _id: '$interestedTags', countTags: { $sum : 1 } } } 
]) 

我試圖解決的問題是:有沒有辦法實現上述功能在一個單一的聚合函數(2兩個步驟1和)?

回答

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版本。