外部收藏集内的标签数组中的GROUP BY标签

时间:2019-06-10 08:47:06

标签: mongodb mongodb-query aggregation-framework

我正在寻找通过位于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中一起唯一(具有唯一索引)

2 个答案:

答案 0 :(得分:0)

除了以下变量的名称之外,您的语法都是正确的:

{ _field1: '$field1', _field2: '$field2' },

定义此类变量时,它们称为user variables,而mongo对它们的命名有一定限制,与“真实”变量约定不同。

来自文档:

  

用户变量名称必须以小写的字母[a-z]或非字母字符开头。

在您的情况下,下划线引起错误。

答案 1 :(得分:0)

好的,我自己解决了。

  1. 我在collection2(filed1,field2)上添加了唯一索引
  2. 添加了额外的展开以平铺标签数组

我的最后一个查询是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 } },
    ]);