0

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

我更新了数组的一个元素,整个数组按更改发送回

整个字段被改变

有没有更好的方法来做更新部分?

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

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

谢谢!

4

1 回答 1

2

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

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

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属性。Pool上面的代码将打印:

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

要更新Pool

Pools.update(id, {$set: {'squares-3-4': 'hello'}});
于 2015-05-15T07:09:44.643 回答