Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MongoDB:$push多个对象,$pop一次更新多个对象_Javascript_Node.js_Mongodb_Meteor_Mongodb Query - Fatal编程技术网

Javascript MongoDB:$push多个对象,$pop一次更新多个对象

Javascript MongoDB:$push多个对象,$pop一次更新多个对象,javascript,node.js,mongodb,meteor,mongodb-query,Javascript,Node.js,Mongodb,Meteor,Mongodb Query,想象一个MongoDB文档包含100个对象的数组。我们希望将数组长度固定在100。当一批新对象到达时(可能是1、5、10等),我们希望用新对象更新数组,同时删除等量的旧对象,以便数组长度保持不变。我选择将MongoDB中的阵列读取到我的应用程序中,进行一些修改,然后使用$set更新阵列: var newData = [ { ... }, { ... }, { ... }, { ... }, { ... } ]; var oldData = Collection.findOne

想象一个MongoDB文档包含100个对象的数组。我们希望将数组长度固定在
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从后面移除等量的对象,这可能吗

是的,使用:

例如,请参见

答案是“是”和“否”,用稍微令人困惑的术语来说。在单个更新中,不能同时对同一数组执行和操作。这对于操作的“相同路径”是不允许的,因为在当前更新语法中,
$push
$pull
实际上都不是以任何顺序发生的

然而,在你的特定环境中,这不是你要问的。为了满足您的需要,MongoDB支持可以与一起使用的修饰符。这将有效地“限制”阵列的总大小,因为新项目将添加到其中

以你为例:

Collection.update(
    { "exchange": "The Exchange", "market": "The Market" },
    { "$push": { "data": { "$each": newData, "$slice": 100 } } }
)
这有效地将数组的大小限制为第一个
100
成员,同时向其中添加新项


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

在我的打字中再次回答。请注意,在JavaScript和“切片”操作的MongoDB语法中,负数表示从数组末尾开始。
Collection.update(
    { "exchange": "The Exchange", "market": "The Market" },
    { "$push": { "data": { "$each": newData, "$slice": 100 } } }
)