2017-02-19 57 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