繁体   English   中英

MongoDB:$推送多个对象,并在单个更新中弹出多个对象

[英]MongoDB: $push Multiple Objects, and $pop Multiple Objects in Single Update

想象一下包含100个对象的MongoDB文档。 我们希望将数组长度固定100 当一批新对象到达时(可能是1,5,10等),我们希望用新对象更新数组,同时删除等量的旧对象,这样数组长度将保持不变。 我选择将MongoDB中的数组读入我的应用程序,进行一些修改,然后使用$set更新数组:

var newData = [
  { ... },
  { ... },
  { ... },
  { ... },
  { ... }
];
var oldData = Collection.findOne({exchange: 'The Exchange', market: 'The Market'}).data;
newData = newData.concat(oldData).slice(0, 100);
Collection.update(
  {
    exchange: 'The Exchange',
    market: 'The Market'
  },
  {
    $set: {
      data: newData
    }
  }

是否有可能在MongoDB中将$push到前面,同时使用$pop从后面移除相同数量的对象?

是否有可能在MongoDB中将$推到前面,同时使用$ pop从后面移除相同数量的对象?

是的,使用$slice

$push: {
    data: {
       $each: [ { ... }, { ... } ], // your batch
       $slice: -100 // maximum array size
    }
 }

有关示例,请参阅http://docs.mongodb.org/manual/tutorial/limit-number-of-elements-in-updated-array/

那么答案是“是”和“否”,将其置于略微混乱的条款中。 你不能做的是在单一更新中同一阵列上的$push$pull操作。 对于“相同路径”的操作不允许这样做,因为$push$pull实际上确定不会以当前更新语法中的任何顺序发生。

但是,在您的具体情况下,这不是您所要求的。 为了做你想做的事,MongoDB支持$slice修饰符,可以和$each一起使用。 当新项目添加到阵列时,这将有效地“限制”阵列的总大小。

按照你的例子:

Collection.update(
    { "exchange": "The Exchange", "market": "The Market" },
    { "$push": { "data": { "$each": newData, "$slice": 100 } } }
)

这有效地将阵列的大小限制为前100成员,同时向其添加新项目。

请注意,meteor实现的“minimongo”客户端版本可能不支持此功能。 你可以做的是在服务器上执行它,并通过发布公开方法。 有很多示例可以向您展示如何使用发布。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM