我在我的MongoDB集合products
中有一個字段,名爲date_expired
。如何修改Mongoose查詢的輸出?
這是type: date
並存儲日期字符串。
我想檢索所有產品並將結果中的date_expired
屬性更改爲現在剩下的小時數。我該怎麼做呢?
這與Laravel ...中的getter()
相似...?
我在我的MongoDB集合products
中有一個字段,名爲date_expired
。如何修改Mongoose查詢的輸出?
這是type: date
並存儲日期字符串。
我想檢索所有產品並將結果中的date_expired
屬性更改爲現在剩下的小時數。我該怎麼做呢?
這與Laravel ...中的getter()
相似...?
您可以創建一個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 }));
在這種情況下會考慮使用聚合框架來輸出轉換。您可以使用$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);
});
我會測試它並讓你知道。非常感謝你的努力。 –
這工作完美。非常感謝。另外,我可以在任何地方使用moment.js,因爲我有很多日期和時間操作要做? –
是的,你可以。只要記得在'moment()'實例上使用'toDate()'擴展方法來返回一個JS Date對象 – chridam
非常感謝。這很簡單。 –
這兩個答案的工作,但這很簡單。謝謝。 –