在mongoDB上具有相关条件的聚合

时间:2015-04-04 08:34:11

标签: mongodb aggregation-framework

我想找到那些患有鼻子过敏然后患上鼻癌的患者。

因此,以下数据应该返回用户 Jack

只有杰克符合查询条件。

请给我一些类似的问题类似于这类问题。非常感谢

样本数据

{
    "id": 1,
    "name": "Mary",
    "symptoms": "nose allerge",
    "datetime": "2011-04-02"
},

{
    "id": 2,
    "name": "Jack",
    "symptoms": "nose allerge",
    "datetime": "2011-04-02"
},

{
    "id": 3,
    "name": "Mark",
    "symptoms": "nose allerge",
    "datetime": "2010-01-02"
},

....


{
    "id": 4,
    "name": "Jack",
    "symptoms": "nose cancer",    
    "datetime": "2015-04-09"
},

{
    "id": 5,
    "name": "Mary",
    "symptoms": "nose cancer",    
    "datetime": "2010-09-02"
},

1 个答案:

答案 0 :(得分:2)

尝试以下聚合管道,首先过滤有关两个症状的文档,然后按datetime降序对下一个管道中的结果文档进行排序,然后按名称对其进行分组,并将这些有序的症状推送到数组diagnosis。然后,通过匹配具有值"nose cancer"的第一个诊断数组元素,进一步过滤先前分组管道中的结果文档,因为这应该是最新的症状,然后第二个元素是"nose allerge"。您最终通过 $project 操作让您的患者:

db.collection.aggregate([
    {
        $match: {
            symptoms: { $in: ["nose allerge", "nose cancer"] }
        }
    },
    {
        $sort: { datetime: -1 }
    },/**/
    {
        $group: {
            _id: "$name",
            "diagnosis": { 
                "$push": "$symptoms" 
             }
        }
    },
    {
        $match: {
            "diagnosis.0": "nose cancer",
            "diagnosis.1": "nose allerge"
        }
    },
    {
        $project: {
            name: "$_id",
            symptoms: "$diagnosis",
            _id: 0
        }
    }
])

结果:

{
    "result" : [ 
        {
            "name" : "Jack",
            "symptoms" : [ 
                "nose cancer", 
                "nose allerge"
            ]
        }
    ],
    "ok" : 1.0000000000000000
}