gpt4 book ai didi

javascript - 当仅更新单个元素时,Meteor 会发送整个数组

转载 作者:行者123 更新时间:2023-12-02 16:10:44 24 4
gpt4 key购买 nike

我有一个包含 10 x 10 二维数组字段的集合。当我更新此数组中的元素时,整个字段都会按更改后发送回给我。

I update one element of array and the entire array is sent back as changed

entire field is changed

有更好的方法来完成更新部分吗?

我是 noSQL 新手,所以也许我只需要重新考虑我的数据库设置。这会有点令人沮丧,因为我喜欢能够将 javascript 对象直接映射到单个集合中的字段的简单性。然而,我不愿意每次更新这个东西时都会损失大约 500 字节的开销。

有没有办法强制 Meteor 用更细粒度的更改来更新客户端?或者这是 Meteor Livequery 的限制有效吗?

谢谢!

最佳答案

问题是 DDP仅支持顶级字段粒度的changed消息。根据您当前的结构,对 squares 子字段的任何更改都将导致整个 squares 字段传输到客户端。

一种替代方法是将二维数组的每个元素存储为单独的顶级字段。下面是使用 - 字符分隔元素的完整工作示例:

var pool2squares = function(pool) {
var squares = [];

_.each(pool, function(value, key) {
var parts = key.split('-');
if (parts[0] === 'squares') {
var i = Number(parts[1]);
var j = Number(parts[2]);
if (squares[i] == null)
squares[i] = [];
squares[i][j] = value;
}
});
return squares;
};

Pools = new Mongo.Collection('pools', {
transform: function(doc) {
return _.extend(doc, {squares: pool2squares(doc)});
}
});

Meteor.startup(function() {
Pools.insert({
'squares-0-0': 'a',
'squares-0-1': 'b',
'squares-1-0': 'c',
'squares-1-1': 'd'
});

console.log(Pools.findOne().squares);
});

这里我们使用 collection transform每当获取每个 Pool 文档时,都会向其添加一个 squares 属性。上面的代码将打印:

[ [ 'a', 'b' ], [ 'c', 'd' ] ]

更新:

Pools.update(id, {$set: {'squares-3-4': 'hello'}});

关于javascript - 当仅更新单个元素时,Meteor 会发送整个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30250312/

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