匹配文档的字段不包含 $group 中的值
Match documents with fields not containing values in $group
我有一个看起来像这样的集合:
{
id: 1
user: 1
gameCategory: aaa/traditional
gameName: Artifact
},
{
id: 2
user: 1
gameCategory: web3
gameName: Axie Infinity
},
{
id: 3
user: 2
gameCategory: aaa/traditional
gameName: League of Legends
},
...
单个文档表示用户在玩游戏。我如何找到以下用户组:
- 只玩“aaa/traditional”游戏
- 只玩“web3”游戏
- 玩两种类型的游戏
我的想法是运行 $group stage with user & gameCategory,然后用$match什么的过滤掉同时玩其他类别游戏的用户
编辑: 这里有很多选项。这是一个简单的:
- 我们使用
$group
为每个用户存储其 gameCategory
,同时也检查他们是否在玩其他游戏,因此填写 other
。这允许我们仅在 groupType
上存储 gameCategory
这是组的键
- 如果
groupType
只包含一个密钥,则为组密钥,否则为'both'
- 仅当
other
键为空时才成立。
$group
by groupType
聚合组 的用户
db.collection.aggregate([
{
$group: {
_id: "$user",
other: {
$addToSet: {
$cond: [
{$and: [{$ne: ["$gameCategory", "web3"]},
{$ne: ["$gameCategory", "aaa/traditional"]}]
}, "true", "$$REMOVE"]
}
},
groupType: {
$addToSet: {
$cond: [
{$or: [{$eq: ["$gameCategory", "web3"]},
{$eq: ["$gameCategory", "aaa/traditional"]}]
}, "$gameCategory", "$$REMOVE"]
}
}
}
},
{
$project: {
other: {$size: "$other"},
groupType: {
$cond: [{$eq: [{$size: "$groupType"}, 1]}, {$arrayElemAt: ["$groupType", 0]},
"both"
]
}
}
},
{$project: {groupType: {$cond: [{$eq: ["$other", 1]}, "other", "$groupType"]}}},
{$group: { _id: "$groupType", users: {$push: "$_id"}}}
])
我有一个看起来像这样的集合:
{
id: 1
user: 1
gameCategory: aaa/traditional
gameName: Artifact
},
{
id: 2
user: 1
gameCategory: web3
gameName: Axie Infinity
},
{
id: 3
user: 2
gameCategory: aaa/traditional
gameName: League of Legends
},
...
单个文档表示用户在玩游戏。我如何找到以下用户组:
- 只玩“aaa/traditional”游戏
- 只玩“web3”游戏
- 玩两种类型的游戏
我的想法是运行 $group stage with user & gameCategory,然后用$match什么的过滤掉同时玩其他类别游戏的用户
编辑: 这里有很多选项。这是一个简单的:
- 我们使用
$group
为每个用户存储其gameCategory
,同时也检查他们是否在玩其他游戏,因此填写other
。这允许我们仅在groupType
上存储gameCategory
这是组的键 - 如果
groupType
只包含一个密钥,则为组密钥,否则为'both' - 仅当
other
键为空时才成立。 $group
bygroupType
聚合组 的用户
db.collection.aggregate([
{
$group: {
_id: "$user",
other: {
$addToSet: {
$cond: [
{$and: [{$ne: ["$gameCategory", "web3"]},
{$ne: ["$gameCategory", "aaa/traditional"]}]
}, "true", "$$REMOVE"]
}
},
groupType: {
$addToSet: {
$cond: [
{$or: [{$eq: ["$gameCategory", "web3"]},
{$eq: ["$gameCategory", "aaa/traditional"]}]
}, "$gameCategory", "$$REMOVE"]
}
}
}
},
{
$project: {
other: {$size: "$other"},
groupType: {
$cond: [{$eq: [{$size: "$groupType"}, 1]}, {$arrayElemAt: ["$groupType", 0]},
"both"
]
}
}
},
{$project: {groupType: {$cond: [{$eq: ["$other", 1]}, "other", "$groupType"]}}},
{$group: { _id: "$groupType", users: {$push: "$_id"}}}
])