2016-01-18 308 views
2

我的文檔GradePovider子文檔,包含元素:貓鼬發現所有滿足條件

{ 
"_id": ObjectId("568a466f2c48409006ab4862"), 
"values": [ 
    { 
     "_id": ObjectId("568a466f2c48409006ab4868"), 
     "description": "has et delicata moderatius" 
    }, 
    { 

     "_id": ObjectId("568a466f2c48409006ab4867"), 
     "description": "description two" 
    }, 
    { 

     "_id": ObjectId("fakeId"), 
     "description": "description three" 
    } 
    ] 
} 

而且我想這樣做的value._id列表的搜索。 使得我得到在由[的ObjectId( 「568a466f2c48409006ab4868」),的ObjectId( 「568a466f2c48409006ab4867」)]的搜索的響應:

{ 
"_id": ObjectId("568a466f2c48409006ab4862"), 
"values": [ 
    { 
     "_id": ObjectId("568a466f2c48409006ab4868"), 
     "description": "has et delicata moderatius" 
    }, 
    { 

     "_id": ObjectId("568a466f2c48409006ab4867"), 
     "description": "description two" 
    } 
    ] 
} 

我使用此代碼的嘗試:

gradeModel.GradeProvider.find({ 
     'values._id': { 
      $in: node.grades 
     } 
     }, { 
     "values.$": true 
     }, function (err, gradeProviders) {} 

此代碼返回只有第一次匹配的值,對於每個gradeProvider。 我想我需要使用這個聚合。到目前爲止,我沒有做到這一點。

radeModel.GradeProvider.aggregate([{ 
     $match: { 
      'values._id': { 
      $in: node.grades 
      } 
     } 
     }, { 
     $project: { 
      providerName: 1, 
      values: 1 
     } 
     }], function (err, gradeProviders) {} 

此代碼返回正確的GradesProviders,但它返回所有的值。

謝謝!

回答

1

下面的管道應爲你工作:

var pipeline = [ 
    { 
     "$match": { 
      "values._id": { "$in": node.grades } 
     } 
    }, 
    { 
     "$project": { 
      "providerName": 1,    
      "values": { 
       "$setDifference": [ 
        { 
         "$map": { 
          "input": "$values", 
          "as": "el", 
          "in": { 
           "$cond": [ 
            { 
             "$setIsSubset": [ 
              [ "$$el._id" ], 
              node.grades 
             ] 
            }, 
            "$$el", 
            false 
           ] 
          } 
         } 
        }, 
        [false] 
       ] 
      } 
     } 
    } 
]; 

gradeModel.GradeProvider.aggregate(pipeline, function (err, gradeProviders) {}); 

,使一個顯著差異的運營商是$setDifference$map運營商。 $map運算符實質上創建了一個新的數組字段,該數組字段將值作爲評估邏輯的結果保存在數組的每個元素的子表達式中。 $setDifference運算符然後返回一個集合,其中元素出現在第一個集合中,但不出現在第二個集合中;即執行第二組相對於第一組的相對補償。在這種情況下,它會返回最終values陣列上,沒有涉及到通過_id財產母文件內容的基礎上,有條件的經營者$cond該評估由運營商$setIsSubset返回的表達。

+0

謝謝你的回答。 –

+0

@marouaneRaji是否解決了你的問題? – chridam

+0

是的,我只有一個點 「$ setIsSubset」: [ 「$$ el._id」], node.grades ] 沒有爲兩個相同的ObjectId(但不是同一個實例)返回true。 任何想法如何管理這種情況? 除了在ObjectId的數組上應用toString嗎? –