2011-05-11 80 views
2

這裏是我的情況: 我在Node.Js中有一個MongoDB集合。在堆棧頂部插入MongoDB並監聽更新

讓我們假設三個元素:a,b,c我想插入新元素作爲第一個元素,並希望最後一個元素熄滅。

因此,這將是: d,A,B

在下一迭代: E,d,一個

1.How做那種insetion的?

2.是否有機會偵聽來自另一個node.js應用程序的這些問題?像

collection.on('update', function() { 
    console.log('updated');  
}); 

回答

5
  1. Capped collections MongoDB中保持插入順序和丟棄基於總集合的大小(不幸的以字節爲單位)的最早的項目。似乎非常適合您的場景。

  2. 我相信在MongoDB中沒有觸發/通知機制,只有手動輪詢。

+3

創建封頂集合時,您可以使用'max'參數指定對象的最大數量這將保留在集合中:http://www.mongodb.org/display/DOCS/Capped+Collections#CappedCollections-max – dcrosta 2011-05-12 01:43:16

+0

對於任何現在遇到這個問題的人來說,他們已經在Mongo 3.6中使用變更流添加了這個功能: https://docs.mongodb.com/manual/changeStreams/ – 2018-01-03 15:37:10

1

另一種方式來處理,這將是寫一個自定義的隊列對象將出列的最後一個項目時,新項目已列入隊列如果在隊列中的項目總數超過了你的要求,併發出「項添加'事件,您的應用程序的其他部分可以監聽。

下面是一些通用的示例代碼中,你將取代裁判數組,長度,與呼叫轉移()和不印字()來的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.