当仅更新单个元素时,Meteor 发送整个数组
Meteor sends entire array when only single element is updated
我有一个包含 10 x 10 二维数组字段的集合。当我更新这个数组中的一个元素时,整个字段都会按更改发送回给我。
更新部分有没有更好的方法?
我是 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 将 squares
属性 添加到每个 Pool
文档中。上面的代码将打印:
[ [ 'a', 'b' ], [ 'c', 'd' ] ]
更新一个Pool
:
Pools.update(id, {$set: {'squares-3-4': 'hello'}});
我有一个包含 10 x 10 二维数组字段的集合。当我更新这个数组中的一个元素时,整个字段都会按更改发送回给我。
更新部分有没有更好的方法?
我是 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 将 squares
属性 添加到每个 Pool
文档中。上面的代码将打印:
[ [ 'a', 'b' ], [ 'c', 'd' ] ]
更新一个Pool
:
Pools.update(id, {$set: {'squares-3-4': 'hello'}});