2017-02-19 23 views
0

我愿意在此集合中应用$ filter以仅在数组中获得“应用数学”结果。我正在以这种[“应用数学”]的形式向下面的集合提供输入。

{ 
    "_id" : ObjectId("58a95d81eead32e82932b535"), 
    "univisorEducation" : [ 
     { 
      "educationLevel" : "BACHELOR", 
      "courseType" : "UNDERGRADUATE", 
      "year" : 2016, 
      "college" : ObjectId("58a936add48f2b502858a70d"), 
      "_id" : ObjectId("58a95eb2eead32e82932b541"), 
      "course" : [ 
       "Anthropology", 
       "Biomedical Engineering", 
       "Applied Mathematics" 
      ] 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("58a9643deead32e82932b54b"), 
    "univisorEducation" : [ 
     { 
      "educationLevel" : "DOCTORATE", 
      "courseType" : "GRADUATE", 
      "year" : 2020, 
      "college" : ObjectId("58a936afd48f2b502858b5e2"), 
      "_id" : ObjectId("58a96495eead32e82932b550"), 
      "course" : [ 
       "Applied Mathematics", 
       "Applied Physics" 
      ] 
     }, 
     { 
      "educationLevel" : "MASTER", 
      "courseType" : "GRADUATE", 
      "year" : 2020, 
      "college" : ObjectId("58a936afd48f2b502858b9f7"), 
      "_id" : ObjectId("58a96495eead32e82932b54f"), 
      "course" : [ 
       "Applied Mathematics" 
      ] 
     } 
    ] 
} 

为此我使用在$项目$过滤器,下面是我的$过滤器的代码

$filter: { 
      input: "$univisorEducation", 
      as: "univisorEducation", 
      cond: { 
       $setIsSubset: ["$$univisorEducation.course", courses] 
      } 
     } 

问题是,我只是得到这个结果

{ "_id" : ObjectId("58a95d81eead32e82932b535"), "univisorEducation" : [ ] } 
{ 
    "_id" : ObjectId("58a9643deead32e82932b54b"), 
    "univisorEducation" : [ 
     { 
      "educationLevel" : "MASTER", 
      "courseType" : "GRADUATE", 
      "year" : 2020, 
      "college" : ObjectId("58a936afd48f2b502858b9f7"), 
      "_id" : ObjectId("58a96495eead32e82932b54f"), 
      "course" : [ 
       "Applied Mathematics" 
      ] 
     } 
    ] 
} 

的与“_id”集合:ObjectId(“58a95d81eead32e82932b535”)应该有应用数学的结果。

+0

你想做什么?子集操作不对称。你的预期产出是多少? – Veeram

+0

我想要的是根据阵列输入值过滤阵列字段数据 –

+0

您的问题是什么?您使用第一个查询得到预期的结果。为什么期望第二个查询在完全不同的查询时返回相同的结果? – Veeram

回答

1

将您的$filter聚合更改为以下。

courses数组与univisorEducation.course进行比较,并返回true,否则匹配univisorEducation.course,否则返回false。

$filter: { 
    input: "$univisorEducation", 
    as: "univisorEducation", 
    cond: { 
     $ne:[{$setIntersection: [courses, "$$univisorEducation.course" ]}, []] 
    } 
} 
+0

我以前做过。我得到了期望的结果,但如果输入课程数组像这样[“应用数学”,“化学和物理”]。我没有结果。有没有什么办法可以达到预期的效果 –

+0

有道理。更新了答案。请确认。 – Veeram