簡體   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