另一种方式来处理,这将是写一个自定义的队列对象将出列的最后一个项目时,新项目已列入队列如果在队列中的项目总数超过了你的要求,并发出“项添加'事件,您的应用程序的其他部分可以监听。
下面是一些通用的示例代码中,你将取代裁判数组,长度,与呼叫转移()和不印字()来的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