Javascript Meteor在只更新单个元素时发送整个阵列

Javascript Meteor在只更新单个元素时发送整个阵列,javascript,arrays,mongodb,meteor,livequery,Javascript,Arrays,Mongodb,Meteor,Livequery,我有一个集合,它有一个10 x 10的二维数组字段。当我更新这个数组中的一个元素时,整个字段都会被发送回我 有没有更好的方法来完成更新部分 我是noSQL新手,所以也许我需要重新考虑一下我的数据库设置。这将有点令人沮丧,因为我喜欢能够将javascript对象直接映射到单个集合中的字段的简单性。一、 但是,我不愿意每次更新这个东西时都损失约500字节的开销 有没有办法强迫Meteor使用更细粒度的更改来更新客户端?或者这是流星如何工作的限制 谢谢 问题在于,只支持顶级字段粒度的更改的消息。在

我有一个集合,它有一个10 x 10的二维数组字段。当我更新这个数组中的一个元素时,整个字段都会被发送回我

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

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

有没有办法强迫Meteor使用更细粒度的更改来更新客户端?或者这是流星如何工作的限制

谢谢

问题在于,只支持顶级字段粒度的
更改的
消息。在当前结构中,对
正方形子字段的任何更改都将导致整个
正方形
字段传输到客户端

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

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);
});
在这里,我们使用一个属性来为每个
文档添加一个
squares
属性。上述代码将打印:

[ [ 'a', 'b' ], [ 'c', 'd' ] ]
要更新

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