【问题标题】:Aggregations with dependent conditions on mongoDB在 mongoDB 上具有依赖条件的聚合
【发布时间】:2015-04-04 22:54:46
【问题描述】:

我想找到那些他/她鼻子过敏然后又得鼻癌的患者。

所以下面的数据应该返回用户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"
},

【问题讨论】:

  • @Michael Mary 将不匹配,因为她被诊断患有鼻癌的日期是在鼻子过敏之前,而不是之后。
  • @chridam 感谢您的进一步解释

标签: mongodb aggregation-framework


【解决方案1】:

尝试以下聚合管道,它首先过滤有关两个症状的文档,然后按 datetime 降序对下一个管道中的结果文档进行排序,然后可以按名称分组并将这些排序的症状推送到数组 @ 987654322@。然后,您通过匹配具有值"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
}

【讨论】:

    猜你喜欢
    • 2021-10-31
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2014-06-08
    • 2018-09-16
    相关资源
    最近更新 更多