我正在寻找通过位于collection2上的标签对collection1进行分组的方法 这两个集合需要由2个字段(field1,field2)连接(查找)
到目前为止,我想到了以下查询:
db.collection1.aggregate([
{
"$lookup": {
"from": "collection2",
"let": { _field1: '$field1', _field2: '$field2' },
"pipeline": [{
"$match": {
"$expr": {
"$and": [
{ "$eq": ["$field1", "$$_field1"] },
{ "$eq": ["$field2", "$$_field2"] }
]
}
}
},
{ "$project": { _id: 0, tags: 1 } },
],
"as": "col2"
}
},
{ "$unwind": "$col2" },
{ $group: { _id: "$col2.tags", count: { $sum: 1 } } }
]);
我什么都没有。
field1和field2在collection2中一起唯一(具有唯一索引)
答案 0 :(得分:0)
除了以下变量的名称之外,您的语法都是正确的:
{ _field1: '$field1', _field2: '$field2' },
定义此类变量时,它们称为user variables,而mongo对它们的命名有一定限制,与“真实”变量约定不同。
来自文档:
用户变量名称必须以小写的字母[a-z]或非字母字符开头。
在您的情况下,下划线引起错误。
答案 1 :(得分:0)
好的,我自己解决了。
我的最后一个查询是foolows:
db.collection1.aggregate([
{
"$lookup": {
"from": "collection2",
"let": { field1: '$field1', field2: '$field2' },
"pipeline": [{
"$match": {
"$expr": {
"$and": [
{ "$eq": ["$field1", "$$field1"] },
{ "$eq": ["$field2", "$$field2"] }
]
}
}
},
{ "$project": { _id: 0, tags: 1 } },
],
"as": "col2"
}
},
{ "$unwind": "$col2" },
{ "$unwind": "$col2.tags" },
{ $group: { _id: "$col2.tags", count: { $sum: 1 } } }
{ $sort: { count: -1 } },
]);