gpt4 book ai didi

mongodb - 在 MongoDB 上聚合后返回完整文档

转载 作者:行者123 更新时间:2023-12-02 21:10:26 25 4
gpt4 key购买 nike

我在两个属性($user 和 $game)上对集合进行分组,以返回与 $score 属性的最大值匹配的文档

这是我的方法:

• 按分数降序排序,
• 按(用户/游戏)分组,
• 选择每个属性上的每个 $first 元素:

db.session.aggregate(
{ $sort: {score: -1} },
{ $group: {
_id: { user: "$user", game: "$game"},
id: { $first: "$_id"},
score: { $first: "$score" },
user: { $first: "$user" },
game: { $first: "$game" },
startDate: { $first: "$startDate" },
.... & all remaining properties
}
},
{ $project: {_id: "$id", score: 1, user: 1, game: 1, startDate: 1, ... } }
)

但我对此并不满意,因为它似乎有点冗长和费力。如果我的 Collection 架构中还需要一个属性,我将需要在多个位置添加该属性。

我相信有更好的方法可以做到这一点。有什么想法吗?

编辑

我的架构定义为(在 javascript 中,使用 Mongoose):

var sessionSchema = new Schema({
user : { type: Schema.ObjectId, ref: 'User' },
game : { type: Schema.ObjectId, ref: 'Game' },
level : Number,
percent : Number,
score : Number,
startDate : Date,
endDate : Date,
});

有很多 User,每个 User 都有几个 Game session 用户 在给定时间玩的游戏。所以一个 User 可以有多个 Session 用于一个 Game。我只想要玩家获得高分的 Session
像这样的东西:

[ {_id: ..., user: u1, game: g1, score: 100, ...},
{_id: ..., user: u2, game: g1, score: 120, ...},
{_id: ..., user: u1, game: g2, score: 90, ...},
...
]

请注意,我已经有了一些有用的东西。我只是想知道是否有更优雅的东西。

最佳答案

更好的选择是使用 $replaceRoot 在 MongoDB 服务器版本 3.4 及更高版本中找到的管道。这会将嵌入的 $$ROOT 文档提升到顶层并替换所有其他字段:

var query = Session.aggregate([
{ '$sort': { 'score': -1 } },
{
'$group': {
'_id': { 'user': '$user', 'quizz': '$quizz' },
'doc': { '$first': '$$ROOT' }
}
},
{ '$replaceRoot': { 'newRoot': '$doc' } }
]);

query.exec( function(err, results) {
if (err)
res.status(500).json({error: err});
else {
res.status(200).json(results);
}
});

关于mongodb - 在 MongoDB 上聚合后返回完整文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33753568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com