Mongodb 在$group之后使用$lookup
我有两个表:userinfo和challengeMongodb 在$group之后使用$lookup,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有两个表:userinfo和challenge **userinfo** username:'aa',nickname:'bb',... **challenge** username:'aa',win:1,loss:0,... username:'aa',win:0,loss:1,... username:'bb',win:1,loss:0,... username:'bb',win:0,loss:1,... 我正在尝试执行mongodb聚合,以对位于查找对象中的用户名进行分组,并根据位于
**userinfo**
username:'aa',nickname:'bb',...
**challenge**
username:'aa',win:1,loss:0,...
username:'aa',win:0,loss:1,...
username:'bb',win:1,loss:0,...
username:'bb',win:0,loss:1,...
我正在尝试执行mongodb聚合,以对位于查找对象中的用户名进行分组,并根据位于挑战中的项求和。
我的代码:
但在结果中,userinfo返回一个空数组:
{ "_id" : "aa", win:12, loss:10,"userinfo" : [ ] }
{ "_id" : "bb", win:2, loss:5,"userinfo" : [ ] }
mongo版本是3.4,那么我在哪里出错呢?您主要有一些结构性问题:
db.challenge.aggregate([
{ "$group" : {
"_id": "$username",
"win": { "$sum": "$win" },
"loss": { "$sum": "$loss" }
}},
{ "$lookup": {
"from": "userinfo",
"localField": "_id",
"foreignField": "username",
"as": "userinfo"
}}
]);
除了修复语法的结构问题外,您似乎缺少的主要内容是,“username”
字段需要包含为“grouping key”,即\u id
完成后,输出中就没有名为“”username“
的字段。聚合管道阶段只能“作为前一阶段的输出”作用于属性。它是一个“管道”,类似于命令行上的pipe|
操作符,与此相同,每个分离的阶段都无法访问前一阶段将其转换为的数据之前的数据形状
因此,由于您的“分组键”现在实际上包含“用户名数据”,只需将其用作语句的“localField”
输入即可。之后的数据看起来不同,因此请使用新的“形状”
db.challenge.aggregate([
{ "$group" : {
"_id": "$username",
"win": { "$sum": "$win" },
"loss": { "$sum": "$loss" }
}},
{ "$lookup": {
"from": "userinfo",
"localField": "_id",
"foreignField": "username",
"as": "userinfo"
}}
]);