mongodb聚合不匹配查询

时间:2018-02-22 09:45:09

标签: mongodb mongoose aggregation-framework nodes

我在下面有一个收藏名称用户详情

[{
"userId": "00UPQAARGT7",
"userPreferences": [{
    "pId": "59SDS64675A00096D48CB",
    "pData": [{
            "name": "FORMAT",
            "value": "CSV"
        },
        {
            "name": "LAN",
            "value": "E"
        }
    ]
},
{
    "pId": "59SDS64675A00096D59DB",
    "pData": [{
            "name": "FORMAT",
            "value": "DOC"
        },
        {
            "name": "LAN",
            "value": "N"
        }
    ]
}
]},
{
"userId": "02UPQAARST7",
"userPreferences": [
{
    "pId": "59SDS64675A00096D48DB",
    "pData": [{
            "name": "FORMAT",
            "value": "CSV"
        },
        {
            "name": "LAN",
            "value": "N"
        }
    ]
},
{
    "pId": "59SDS64675A00096D59DB",
    "pData": [{
            "name": "FORMAT",
            "value": "PPT"
        },
        {
            "name": "LAN",
            "value": "N"
        }
    ]
}
]}  

] 并有另一个收集产品

[{
    "pId": "59SDS64675A00096D48CB",
    "rInfo": {
        "format": "TAB"
    },
    "LAN": "P",
    "cPro": "TRUE"
},
{
    "pId": "59SDS64675A00096D48CB",
    "rInfo": {
        "format": "SHAPE"
    },
    "LAN": "N",
    "cPro": "FALSE"
},
{
    "pId": "59SDS64675A00096D48DB",
    "rInfo": {
        "format": "CSV"
    },
    "LAN": "E",
    "cPro": "TRUE"
},
{
    "pId": "59SDS64675A00096D48DB",
    "rInfo": {
        "format": "CSV"
    },
    "LAN": "E",
    "cPro": "TRUE"
},
{
    "pId": "59SDS64675A00096D59DB",
    "rInfo": {
        "format": "SQL"
    },
    "LAN": "E",
    "cPro": "TRUE"
}

]

现在我想使用mongodb查询从products collection中获取匹配pId的所有用户,其中userId.userPreferences.pData名称/值组合与products.rInfo.format和products.LAN基本输出将在下面匹配,任何帮助

[{
"userId": "00UPQAARGT7",
"userPreferences": [{
    "pId": "59SDS64675A00096D59DB"
}]
},
{
"userId": "02UPQAARST7",
 "userPreferences": [{
    "pId": "59SDS64675A00096D59DB"
}]
}]

1 个答案:

答案 0 :(得分:0)

您可以使用聚合阶段,我将解释查询中的4个阶段。

  1. $ unwind将完全展开您的产品系列,因此mongo可以为您拥有的每个对象单独工作。
  2. $ lookup将执行加入用户 - 产品。
  3. $ project(可选)将编写您需要的数据的自定义输出;我是根据你的要求写的。
  4. $ groupby使用userId作为键对结果进行分组。
  5. 查询:

    db.name.aggregate([
        {
            $unwind: "$userPreferences"
        },
        {
            $lookup:
                {
                    from: "products",
                    localField: "userPreferences.pId",
                    foreignField: "pId",
                    as: "product"
                }
        },
        {
            $project: {
                userId: 1,
                "userPref": "$product.pId",
            }
        },
        {
            $group : { _id : "$userId" }
        }
    ]);