簡體   English   中英

如何修改貓鼬查詢的輸出?

[英]How do I modify the output of a Mongoose query?

我的MongoDB集合products有一個名為date_expired

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

我想檢索所有產品並將結果中的date_expired屬性更改為從現在起剩余的小時數。 我該怎么做呢?

它類似於Laravel中的getter() ...?

您可以創建一個虛擬屬性 ,該屬性將返回到期前的小時數:

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

要訪問此屬性:

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

如果要將該屬性包括在任何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

以以下簡短的mongo shell演示為例,它將努力推動這一概念的發展:

填充測試集合:

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()方法作為查詢基礎將其應用於Mongoose實現:

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);
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM