2012-07-13 95 views
1

I'be試圖鏈方法添加到稱爲「分頁」的查詢對象。如果我將它添加到query.js中,我可以毫無問題地使用它。但是,修改其中一個核心文件並不是一個好主意。如何貓鼬伸出查詢對象

我使用這個代碼,我發現了一些修改,並希望它成爲查詢原型的一部分,但我還沒有上使其工作出Query.js的任何成功。

我該如何做到這一點?有沒有關於如何通過模塊擴展這些核心文件的文檔?我還沒有找到任何適合我的東西。

mongoose.Query.prototype.paginate = function(page, limit, cb) { 
    var model, query, skipFrom; 
    if (page == null) { 
    page = 1; 
    } 
    if (limit == null) { 
    limit = 10; 
    } 
    query = this; 
    model = this.model; 
    skipFrom = (page * limit) - limit; 
    query = query.skip(skipFrom).limit(limit); 
    if (cb) { 
    return query.run(function(err, docs) { 
     if (err) { 
     return cb(err, null, null); 
     } else { 
     return model.count(query._conditions, function(err, total) { 
      return cb(null, total, docs); 
     }); 
     } 
    }); 
    } else { 
    throw new Error("pagination needs a callback as the third argument."); 
    } 
}; 

回答

2

原來這是一個比我預期的要容易得多。這是我做過什麼和它的工作:

創建一個paginate.js文件有:

mongoose = require('mongoose'); 

mongoose.Query.prototype.paginate = function(aPageStart, aLimit, aCallback) { 
    var model, query; 

    if (aLimit == null) { 
    aLimit = 10; 
    } 
    query = this; 
    model = this.model; 
    query = query.skip(aPageStart).limit(aLimit); 
    if (aCallback) { 
    return query.run(function(aError, aDocs) { 
     if (aError) { 
     return aCallback(aError, null, null); 
     } else { 
     return model.count(query._conditions, function(aError, aTotal) { 
      return aCallback(null, aTotal, aDocs); 
     }); 
     } 
    }); 
    } else { 
    throw new Error("pagination needs a callback as the third argument."); 
    } 
}; 

,只是要求它需要的地方(在我的模型在這種情況下)。

然後你就可以調用此方法作爲最後一個鏈條。

乾杯,

馬科斯。

+2

伊克!這可行......但直接擴展這樣的庫通常被認爲是髒的,因爲庫的內部可能會將版本更改爲版本。通過庫的簡單升級,您可能會遇到一個非常糟糕的方法。節點庫在圖書館內部發生巨大的內部變化(並且經常是外部變化)方面臭名昭着。如果你願意承擔破壞風險,那麼就可以開火,但是採用「靜態」可能會更安全。 – 2012-11-29 20:48:15

0

也許你可以使用此模塊,或看他們如何實現它:mongoose-paginate

另一種解決方案是創建一個方法,你的架構那樣:

Schema.statics.paginate = (page, limit, cb) -> 
    ... 
    return query; 
// or 
Schema.statics.paginate = (query, page, limit, cb) -> 
    ... 
    return query.exec(); 
+0

是。那是另一種方式。不過,我想它是查詢對象的一部分,所以它可以與其他的查詢方法來捆綁,像查找,分類,填充,GT,LT等.. 因此,例如,你將能夠從做你的模型(簡體):。 this.find()GT()填充( 「實體」)排序()分頁(PARAMS)等等 – markitusss 2012-07-13 15:47:08