Jon*_*rsi 5 javascript mongodb node.js meteor mongodb-query
想象一下包含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
}
}
Run Code Online (Sandbox Code Playgroud)
是否有可能在MongoDB $push中将新的东西放到前面,同时使用$pop从后面移除相同数量的对象?
是否有可能在MongoDB中将$推到前面,同时使用$ pop从后面移除相同数量的对象?
是的,使用$slice:
$push: {
data: {
$each: [ { ... }, { ... } ], // your batch
$slice: -100 // maximum array size
}
}
Run Code Online (Sandbox Code Playgroud)
有关示例,请参阅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 } } }
)
Run Code Online (Sandbox Code Playgroud)
这实际上将数组的大小限制为第一个100成员,同时向其中添加了新项目。
请注意,尽管流星实现的客户端版本的“ minimongo”可能不支持此功能。但是,您可以做的是在服务器上执行此操作,然后通过发布公开该方法。有很多示例向您展示如何使用发布。
| 归档时间: |
|
| 查看次数: |
2254 次 |
| 最近记录: |