mongodb多个匹配条件并返回具有公共名称的文档

mongodb多个匹配条件并返回具有公共名称的文档,mongodb,match,aggregation-framework,multiple-conditions,Mongodb,Match,Aggregation Framework,Multiple Conditions,以下数据存在于“examSheet”集合中 {"name":"a1", "std":"9", "year":"2017", "exam":"halfyr_T", "marks":[{"p":"45","m":"40","c":"50"}]} {"name":"a1", "std":"9", "year":"2017", "exam":"halfyr_P", "marks":[{"p":"40","m":"28","c":"38"}]} {"name":"a1", "std":"9", "year

以下数据存在于“examSheet”集合中

{"name":"a1", "std":"9", "year":"2017", "exam":"halfyr_T", "marks":[{"p":"45","m":"40","c":"50"}]}
{"name":"a1", "std":"9", "year":"2017", "exam":"halfyr_P", "marks":[{"p":"40","m":"28","c":"38"}]}
{"name":"a1", "std":"9", "year":"2017", "exam":"annual_T", "marks":[{"p":"40","m":"50","c":"48"}]}
{"name":"a1", "std":"9", "year":"2017", "exam":"annual_P", "marks":[{"p":"45","m":"42","c":"18"}]}
{"name":"a2", "std":"9", "year":"2017", "exam":"halfyr_T", "marks":[{"p":"25","m":"30","c":"50"}]}
{"name":"a2", "std":"9", "year":"2017", "exam":"halfyr_P", "marks":[{"p":"41","m":"48","c":"28"}]}
{"name":"a2", "std":"9", "year":"2017", "exam":"annual_T", "marks":[{"p":"30","m":"48","c":"24"}]}
{"name":"a2", "std":"9", "year":"2017", "exam":"annual_P", "marks":[{"p":"35","m":"08","c":"38"}]}
{"name":"b1", "std":"10", "year":"2017", "exam":"halfyr_T","marks":[{"p":"45","m":"40","c":"50"}]}
{"name":"b1", "std":"10", "year":"2017", "exam":"halfyr_P", "marks": [{"p":"40","m":"28","c":"38"}]}
{"name":"b1", "std":"10", "year":"2017", "exam":"annual_T", "marks": [{"p":"40","m":"50","c":"48"}]}
{"name":"b1", "std":"10", "year":"2017", "exam":"annual_P", "marks": [{"p":"45","m":"42","c":"18"}]}
{"name":"b2", "std":"10", "year":"2017", "exam":"halfyr_T", "marks": [{"p":"25","m":"30","c":"50"}]}
{"name":"b2", "std":"10", "year":"2017", "exam":"halfyr_P", "marks": [{"p":"41","m":"48","c":"28"}]}
{"name":"b2", "std":"10", "year":"2017", "exam":"annual_T", "marks": [{"p":"30","m":"48","c":"24"}]}
{"name":"b2", "std":"10", "year":"2017", "exam":"annual_P", "marks": [{"p":"35","m":"08","c":"38"}]}

我想返回聚合json输出,其中一个名称满足所有条件。 Ex:std:9,学年:2017,考试:物理成绩>25分的半学年大学理论 标准:9,年份:2017,考试:物理成绩>35的年度大学理论

我尝试了以下不同的方法, 符合条件,, 能够获取“名称”,但无法再次匹配/提取文档数据

db.examSheet.aggregate([{$facet: {
    'halfyr': [ {$match: {$and: [{'exam': 'halfyr_T'},{'std': '9'},{'year': "2017"},{'marks.p': {$gte: '25'}}]}}],
    "annual": [ {$match: {$and: [{'exam': 'annual_T'},{'std': '9'},{'year': "2017"},{'marks.p': {$gte: '35'}}]}}] 
    }
},
{$project: {'_id': 0, "combined": {$setIntersection: ['$halfyr.name', '$annual.name']}}}
                    ]);
已尝试,在[组合]项目后将halfyr.name与
$匹配,等等。
但无法解决问题

请帮助或建议我解决此问题

我试过这样做

db.examSheet.aggregate([{$facet: {
                            "halfyr": [ {$match: {$and: [{'exam': 'halfyr_T'},{'std': '9'},{'year': "2017"},{'marks.p': {$gte: '25'}}]}}],
                            "annual": [ {$match: {$and: [{'exam': 'annual_T'},{'std': '9'},{'year': "2017"},{'marks.p': {$gte: '35'}}]}}] 
                            }
                    },
                    {$unwind : "$annual"}
                ]);
我的输出是:

{
    "halfyr" : [
            {
                    "_id" : ObjectId("5a98c639b0ae80e6c6a92031"),
                    "name" : "a1",
                    "std" : "9",
                    "year" : "2017",
                    "exam" : "halfyr_T",
                    "marks" : [
                            {
                                    "p" : "45",
                                    "m" : "40",
                                    "c" : "50"
                            }
                    ]
            },
            {
                    "_id" : ObjectId("5a98c639b0ae80e6c6a9203e"),
                    "name" : "a2",
                    "std" : "9",
                    "year" : "2017",
                    "exam" : "halfyr_T",
                    "marks" : [
                            {
                                    "p" : "25",
                                    "m" : "30",
                                    "c" : "50"
                            }
                    ]
            }
    ],
    "annual" : {
            "_id" : ObjectId("5a98c639b0ae80e6c6a92038"),
            "name" : "a1",
            "std" : "9",
            "year" : "2017",
            "exam" : "annual_T",
            "marks" : [
                    {
                            "p" : "40",
                            "m" : "50",
                            "c" : "48"
                    }
            ]
    }
}

有人能建议如何匹配或过滤出半年和年度中常见的名称吗? 提前谢谢

期望输出:

{
"name":"a1", "std":"9", "year":"2017",
"halfyr" : {"exam":"halfyr_T", "marks": [{"p":"45","m":"40","c":"50"}]},
"annual" : {"exam":"annual_T", "marks": [{"p":"40","m":"50","c":"48"}]}
}
你可以用。里面


我解决了它使用一些额外的计数文件

谢谢大家的时间和建议

db.examSheet.aggregate([
 {
  "$match":{
    "$and":[
      {"$or":[
        {"exam":"halfyr_T","marks.p":{"$gte":"25"}},
        {"exam":"annual_T","marks.p":{"$gte":"35"}}
      ]},
      {"std":"9"},
      {"year":"2017"}
    ]
 }},
 {$group: {
        "_id": {
            "code": "$name",
            "type": { "$cond": [ 
                { "$and":[
                    { "$gte": [ "$marks.p", 25 ] },
                    { "$eq": [ "$exam", "halfyr_T" ] }
                ]},
                "A",
                "B"
            ]}
        },
        "all_data" : {$addToSet : "$$ROOT"}
    }},
        // Simply add up the results for each "type"
    { "$group": {
        "_id": "$_id.code",
        "all_data" : {$addToSet : "$all_data"},
        "score": { "$sum": 1 }
    }},
        // Now filter to keep only results with score 2
    { "$match": { "score": 2 }},
    {$project : {_id :0 , all_data : 1}}
]);

$or-即使其中一个条件匹配,也将给出结果。如果我使用$and-我就没有输出。谢谢你的建议。但我的问题仍然存在。更新答案。这很有帮助。谢谢它提供了所有匹配的文档。但是我怎样才能过滤出符合这两个条件的名字呢?有什么想法吗?我尝试了,$match,$push,$eq等,但没有得到想要的输出。
db.examSheet.aggregate([
 {
  "$match":{
    "$and":[
      {"$or":[
        {"exam":"halfyr_T","marks.p":{"$gte":"25"}},
        {"exam":"annual_T","marks.p":{"$gte":"35"}}
      ]},
      {"std":"9"},
      {"year":"2017"}
    ]
 }},
 {$group: {
        "_id": {
            "code": "$name",
            "type": { "$cond": [ 
                { "$and":[
                    { "$gte": [ "$marks.p", 25 ] },
                    { "$eq": [ "$exam", "halfyr_T" ] }
                ]},
                "A",
                "B"
            ]}
        },
        "all_data" : {$addToSet : "$$ROOT"}
    }},
        // Simply add up the results for each "type"
    { "$group": {
        "_id": "$_id.code",
        "all_data" : {$addToSet : "$all_data"},
        "score": { "$sum": 1 }
    }},
        // Now filter to keep only results with score 2
    { "$match": { "score": 2 }},
    {$project : {_id :0 , all_data : 1}}
]);