另一種方式來處理,這將是寫一個自定義的隊列對象將出列的最後一個項目時,新項目已列入隊列如果在隊列中的項目總數超過了你的要求,併發出「項添加'事件,您的應用程序的其他部分可以監聽。
下面是一些通用的示例代碼中,你將取代裁判數組,長度,與呼叫轉移()和不印字()來的MongoDB:
var util=require('util'), // for inheritance
EventEmitter=require('events').EventEmitter, // for event handling
MaxQueueItems=10; // default total items in queue
var FixedSizeQueue=function(max){
this._storage=[]; // replace with call to MongoDB
this._max_items=max||MaxQueueItems;
};
util.inherits(FixedSizeQueue,EventEmitter); // now I can emit
FixedSizeQueue.prototype._add=function(item){ // private
// replace with call to MongoDB
this.emit('onItemAdd', this._storage.unshift(item), item);
};
FixedSizeQueue.prototype._remove=function(){ // private
// replace with call to MongoDB
var item=this._storage.shift();
if(item) {
this.emit('onItemRemove', this._storage.length, item);
return item;
}
};
FixedSizeQueue.prototype.enqueue=function(item){
if (this._storage.length+1 > this._max_items) {
this._remove();
}
this._add(item);
return(this); // for chaining
};
FixedSizeQueue.prototype.dequeue=function(){
return this._remove();
};
它可以作爲:
var q=new FixedSizeQueue(3); // a queue with only three items
q.on('onItemAdd',function(len,item){
console.log('item added, queue now contains '+len+' items.');
});
q.on('onItemRemove',function(len,item){
console.log('item removed, queue now contains '+len+' items.');
});
q.enqueue(1); // emits onItemAdd, queue = (1)
q.enqueue(2); // emits onItemAdd, queue = (2,1)
q.enqueue(3); // emits onItemAdd, queue = (3,2,1)
q.enqueue(1); // emits onItemRemove and onItemAdd, queue = (4,3,2)
控制檯輸出:
item added, queue now contains 1 items.
item added, queue now contains 2 items.
item added, queue now contains 3 items.
item removed, queue now contains 2 items.
item added, queue now contains 3 items.
創建封頂集合時,您可以使用'max'參數指定對象的最大數量這將保留在集合中:http://www.mongodb.org/display/DOCS/Capped+Collections#CappedCollections-max – dcrosta 2011-05-12 01:43:16
對於任何現在遇到這個問題的人來說,他們已經在Mongo 3.6中使用變更流添加了這個功能: https://docs.mongodb.com/manual/changeStreams/ – 2018-01-03 15:37:10