Вставка в MongoDB поверх стека и прослушивание обновлений - PullRequest
2 голосов
/ 12 мая 2011

Вот мой случай: У меня есть коллекция MongoDB в Node.Js.

Скажем, три элемента: a, b, c Я хочу вставить новый элемент в качестве первого и хочу, чтобы последний вышел.

Так было бы: д, а, б

В следующей итерации: е, д, а

1.Как сделать такое насекомое?

2. Есть ли возможность прослушать эти вставки из другого приложения node.js? Что-то вроде

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

Ответы [ 2 ]

5 голосов
/ 12 мая 2011
  1. Закрытые коллекции в MongoDB сохраняют порядок вставки и отбрасывают самые старые элементы на основе общего размера коллекции (к сожалению, измеряется в байтах).Кажется, идеально подходит для вашего сценария.

  2. Я считаю, что в MongoDB пока нет механизма триггера / уведомления, только ручной опрос.

1 голос
/ 12 мая 2011

Еще один способ справиться с этим - написать собственный объект Queue, который удалял бы последний элемент из очереди, когда новый элемент был помещен в очередь, если общее количество элементов в очереди превышало ваши требования, и генерировал событие 'добавление элемента', которое другие части вашего приложения могут слушать.

Вот несколько примеров кода, в котором вы бы заменили ссылки на Array, length, shift () и unshift () на вызовы 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...