创建一个只能在mongodb中包含x项的列表

时间:2015-04-15 14:50:07

标签: mongodb meteor

我想创建一个recentlyVisited列表,这是一个限制为三个项目的列表。比前三个更早的结果将被“推离”列表的边缘(并且完全不相关,因此可以删除)。

对于起始数据类型,请说我有类似的东西。

{
  "username": "corvid",
  "recentlyVisited": ['1234', '5678', '1470']
}

然后,在提交此问题时,我可能会执行以下操作

Template.question.onCreated(function() {
  var questionId = Router.current().params._id;
  Meteor.users.update(Meteor.userId(), {
    $push: { "recentlyVisited": questionId }
  });
});

我可以像这样发布它,但它仍然无法解决核心问题。

Meteor.publish('currentUser', function() {
  if(this.userId) {
    return Meteor.users.find(
      { _id: this.userId },
      { limit: { recentlyVisited: 3 } }
    );
  }
});

是否可以$push但是可以限制集合中可以维护的数量?

2 个答案:

答案 0 :(得分:1)

看起来您需要$slice运算符。

Meteor.users.update(Meteor.userId(), {
  $push: {
    recentlyVisited: {
      $each: [ questionId ],
      $position: 0,
      $slice: 3
    }  
  }
});

http://docs.mongodb.org/manual/reference/operator/update/slice/

答案 1 :(得分:1)

是否可以$ push但限制可维持的数量 设置?

请使用$slice

  

$ slice修饰符限制$ push期间的数组元素数   操作

     

另一个引用来自http://docs.mongodb.org/manual/reference/operator/projection/slice/

     

有关在更新期间限制数组大小的信息   $ push,请参阅$ slice修饰符

所以只需改变代码就好了。

Template.question.onCreated(function() {
  var questionId = Router.current().params._id;
  Meteor.users.update(Meteor.userId(),{$push:{
   recentlyVisited:{
    $each:[questionId ],
    $slice:3
    }
 }});
});