2016-06-11 69 views
1

我在我的MongoDB集合products中有一個字段,名爲date_expired如何修改Mongoose查詢的輸出?

這是type: date並存儲日期字符串。

我想檢索所有產品並將結果中的date_expired屬性更改爲現在剩下的小時數。我該怎麼做呢?

這與Laravel ...中的getter()相似...?

回答

3

您可以創建一個virtual property,將返回的小時數,直到到期日:如果你想包括

console.log('hours to expiry:', doc.hoursToExpiry) 

ProductSchema.virtual('hoursToExpiry').get(function() { 
    return (this.date_expired - Date.now())/3600000; 
}); 

要訪問此屬性屬性在任何JSON或JS對象中,請確保您設置爲virtuals : true

console.log('%j', doc.toJSON({ virtuals : true })); 
+0

非常感謝。這很簡單。 –

+0

這兩個答案的工作,但這很簡單。謝謝。 –

1

在這種情況下會考慮使用聚合框架來輸出轉換。您可以使用$project管道算術運算符$divide$subtract以實現最終目標。這將使你能夠進行計算的小時數期滿即實現公式的運算:

hoursToExpiry = (date_expired - timeNow)/1000*60*60 //the time units are all in milliseconds 

就拿下面的簡短蒙戈外殼演示,將力爭到驅動之家這個概念:

填充測試集:

db.test.insert([ 
    { 
     "date_expired": ISODate("2016-03-27T10:55:13.069Z"), 
     "name": "foo" 
    }, 
    { 
     "date_expired": ISODate("2016-06-11T20:55:13.069Z"), 
     "name": "bar" 
    }, 
    { 
     "date_expired": ISODate("2016-06-11T16:17:23.069Z"), 
     "name": "buzz" 
    } 
]) 

匯聚操作:

db.test.aggregate([ 
    { 
     "$project": { 
      "name": 1, 
      "dateExpired": "$date_expired", 
      "dateNow": { "$literal": new Date() }, 
      "hoursToExpiry": { 
       "$divide": [ 
        { "$subtract": [ "$date_expired", new Date() ] }, 
        1000*60*60 
       ] 
      } 
     } 
    } 
]) 

結果(在寫作的時候):

{ 
    "result" : [ 
     { 
      "_id" : ObjectId("575c0f6e8101b29fc93e5b9d"), 
      "name" : "foo", 
      "dateExpired" : ISODate("2016-03-27T10:55:13.069Z"), 
      "dateNow" : ISODate("2016-06-11T13:36:21.025Z"), 
      "hoursToExpiry" : -1826.685543333333 
     }, 
     { 
      "_id" : ObjectId("575c0f6e8101b29fc93e5b9e"), 
      "name" : "bar", 
      "dateExpired" : ISODate("2016-06-11T20:55:13.069Z"), 
      "dateNow" : ISODate("2016-06-11T13:36:21.025Z"), 
      "hoursToExpiry" : 7.314456666666667 
     }, 
     { 
      "_id" : ObjectId("575c0f6e8101b29fc93e5b9f"), 
      "name" : "buzz", 
      "dateExpired" : ISODate("2016-06-11T16:17:23.069Z"), 
      "dateNow" : ISODate("2016-06-11T13:36:21.025Z"), 
      "hoursToExpiry" : 2.683901111111111 
     } 
    ], 
    "ok" : 1 
} 

通過上述管道,你可以將其採納你的貓鼬實現與aggregate()方法的基礎您的查詢:

Product.aggregate([ 
    { 
     "$project": { 
      "name": 1, 
      "dateExpired": "$date_expired", 
      "dateNow": { "$literal": new Date() }, 
      "hoursToExpiry": { 
       "$divide": [ 
        { "$subtract": [ "$date_expired", new Date() ] }, 
        1000*60*60 
       ] 
      } 
     } 
    } 
]).exec(function (err, result) { 
    // Handle err 
    console.log(result); 
}); 

或使用更多富裕的API:

Product.aggregate() 
    .project({ 
     "name": 1, 
     "dateExpired": "$date_expired", 
     "dateNow": { "$literal": new Date() }, 
     "hoursToExpiry": { 
      "$divide": [ 
       { "$subtract": [ "$date_expired", new Date() ] }, 
       1000*60*60 
      ] 
     } 
    }) 
    .exec(function (err, result) { 
     // Handle err 
     console.log(result); 
    }); 
+0

我會測試它並讓你知道。非常感謝你的努力。 –

+0

這工作完美。非常感謝。另外,我可以在任何地方使用moment.js,因爲我有很多日期和時間操作要做? –

+0

是的,你可以。只要記得在'moment()'實例上使用'toDate()'擴展方法來返回一個JS Date對象 – chridam