2011-05-11 63 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.