我有post
这样的文件:
post = {
"_id": "uid1",
"userID": "user1",
"likeNum": 30,
}
我当前的管道如下所示,其中包含user_ids
要避免的用户 ID 数组以及seen_ids
要避免的帖子 ID 数组:
fake_pipeline = [
{'$match': {'userID': {'$nin': user_ids}, '_id': {"$nin": seen_ids}}},
{'$group': {'_id': '$userID', 'posts': {'$push': '$likeNum'}}},
{'$project': {'posts': {'$slice': [{'$sortArray': {'input': '$posts', 'sortBy': {'likeNum': -1}}}, 2]}}},
{'$limit': 10}
]
我希望聚合返回一个post
按排序的 10 个列表,但每个likeNum
descending
最多 2 个。post
userID
例子 :
post_list_in_db = [
{"_id": "uid1", "userID": "user1", "likeNum": 29},
{"_id": "uid2", "userID": "user1", "likeNum": 2},
{"_id": "uid3", "userID": "user1", "likeNum": 13},
{"_id": "uid4", "userID": "user2", "likeNum": 21},
{"_id": "uid5", "userID": "user2", "likeNum": 19},
{"_id": "uid6", "userID": "user3", "likeNum": 1},
{"_id": "uid7", "userID": "user3", "likeNum": 8},
{"_id": "uid8", "userID": "user3", "likeNum": 14},
{"_id": "uid9", "userID": "user3", "likeNum": 4},
{"_id": "uid10", "userID": "user4", "likeNum": 20},
{"_id": "uid11", "userID": "user4", "likeNum": 9},
{"_id": "uid12", "userID": "user4", "likeNum": 11},
]
预期输出为:
[
{"_id": "uid1", "userID": "user1", "likeNum": 29},
{"_id": "uid4", "userID": "user2", "likeNum": 21},
{"_id": "uid10", "userID": "user4", "likeNum": 20},
{"_id": "uid5", "userID": "user2", "likeNum": 19},
{"_id": "uid8", "userID": "user3", "likeNum": 14},
{"_id": "uid3", "userID": "user1", "likeNum": 13},
{"_id": "uid12", "userID": "user4", "likeNum": 11},
{"_id": "uid7", "userID": "user3", "likeNum": 8},
]
注意:出于性能原因,我希望使用最少的代码aggregation
,不需要像示例输出那样完美地格式化数据,除非它对性能没有影响,否则我更喜欢自己在代码中重新排序/转换对象,只要我有正确的post
列表内容(但没有特别的格式或顺序)作为聚合的输出。