gpt4 book ai didi

javascript - MongoDB:单次更新中的$push 多个对象和$pop 多个对象

转载 作者:可可西里 更新时间:2023-11-01 09:08:53 25 4
gpt4 key购买 nike

想象一个包含 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 从后面删除等量的对象?

最佳答案

好吧,答案既是"is"又是“否”,用稍微令人困惑的术语来说。你不能同时做 $push$pull在单个更新中对同一数组进行操作。这对于操作的“相同路径”是不允许的,因为 $push$pull 都没有真正确定在当前更新语法中以任何顺序发生。

但是在您的特定上下文中,这不是您要问的。做你想做的事,MongoDB 支持 $slice可以与 $each 一起使用的修饰符.这将在向数组添加新项时有效地“限制”数组的总大小。

按照你的例子:

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

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

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

关于javascript - MongoDB:单次更新中的$push 多个对象和$pop 多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28897151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com