2015-01-03 33 views
2

在蒙戈數據庫我有以下的記錄

{ 
    "_id" : ObjectId("54a0d4c5bffabd6a179834eb"), 
    "is_afternoon_scheduled" : true, 
    "employee_id" : ObjectId("546f0a06c7555ae310ae925a"), 
    "currDate" : ISODate("2014-12-28T18:30:00Z"), 
    "modified_date" : ISODate("2014-12-29T04:12:53.677Z"), 
    "modified_by" : ObjectId("541a9c223416b36f67cfbfe8"), 
    "__v" : 0, 
    "manager_schedule" : { 
     "afternoon_schedule_details" : { 
      "event" : ObjectId("54507897cecff53914c82b6d"), 
      "is_afternoon_scheduled" : true 
     }, 
     "modified_by" : ObjectId("541a9c223416b36f67cfbfe8"), 
     "modified_date" : ISODate("2014-12-29T04:13:00.432Z") 
    } 
} 

我想過濾集合體$匹配等於EMPLOYEE_ID。我在貓鼬中使用下面的查詢,但我沒有得到任何查詢結果。方法或查詢有問題。但是當我直接在MongoDB中運行這個查詢時,我得到了正確的結果。在這方面需要幫助。

Availability.aggregate() 
      .match({ employee_id : "546f0a06c7555ae310ae925a" }) 
      .group({_id : "$employee_id",count: { $sum: 1 }}) 
      .exec(function (err, response) { 
       if (err) console.log(err); 
       res.json({"message": "success", "data": response, "status_code": "200"}); 
      } 
     ); 

回答

1

使用功能mongoose.Types.ObjectId()獲得ObjectId()的字符串,然後使用它 在$match階段進行查詢。

var val = mongoose.Types.ObjectId("546f0a06c7555ae310ae925a"); 
Availability.aggregate() 
      .match({ employee_id : val}) 
      .group({_id : "$employee_id",count: { $sum: 1 }}) 
      .exec(function (err, response) { 
       if (err) console.log(err); 
       res.json({"message": "success", "data": response, 
         "status_code": "200"}); 
      } 
); 
+0

感謝它的工作:) – Dipak

1

如果貓鼬幫手.match()方法在這裏不喜歡的東西什麼其他的查詢和更新助手做這將是一種不錯的。但是我猜不出它有一個很好的理由。

您可以在Mongoose中的常規.find()查詢中拋出這樣的字符串,因爲爲您使用的模型定義的模式應用於「轉換」查詢對象中使用的任何字段的類型。所以它只會將字符串強制爲一個ObjectId值。

也許在這裏可能會創建一些智能來認識到這是「第一」流水線階段,但這並不是以同樣的方式工作的主要原因是因爲彙總框架旨在「遠離」文檔他們最初提供的定義的模式結構。

所以,你需要導入ObjectId()功能,並用它來正確地投值:

var ObjectId = require('mongodb').ObjectID(); 

Availability.aggregate() 
      .match({ employee_id : ObjectId("546f0a06c7555ae310ae925a") }) 
      .group({_id : "$employee_id",count: { $sum: 1 }}) 
      .exec(function (err, response) { 
       if (err) console.log(err); 
       res.json({"message": "success", "data": response, "status_code": "200"}); 
      } 
     ); 

您需要手動做到這一點,因爲它不能爲你做它。