使用collection-hooks将新文档的id添加到现有文档中的数组

时间:2016-01-17 06:58:13

标签: javascript meteor hook meteor-collection-hooks

我在插入文档后使用matb33:collection-hooks插入文档,是否可以在插入后更新现有文档?我试图做以下事情:

  • 在模板Box中,其数据上下文的_idboxId,调用方法将新文档插入Targets集合
  • 获取新文档的_id,并将其添加到_id boxId的文档数组中。

由于this引用了新文档,我无法弄清楚如何让boxId更新正确的文档。

每张Pawel的最终代码答案:

Template.Box.events({
    'click .add button': function(e) {
        e.preventDefault();

        var currentBoxId = this._id;
        var target = {
            ...
        };

        Meteor.call('targetAdd', target, currentBoxId, function(){});
    }
});

Meteor.methods({
    targetAdd: function(targetAttributes, currentBoxId) {
        check(this.userId, String);
        check(currentBoxId, String);
        check(targetAttributes, {
            ...
        });

        var target = _.extend(targetAttributes, {
            userId: user._id,
            submitted: new Date()
        });

        var targetId = Targets.insert(target);
        Boxes.update(currentBoxId, {$addToSet: {targets:targetId}});

        return {
            _id: targetId
        };
    }
});

2 个答案:

答案 0 :(得分:0)

集合钩子不知道并且不依赖于文档的插入/更新位置(这是集合钩子的一个点 - 操作来自哪里无关紧要,钩子应该总是表现出来同样的方式)。

更重要的是,即使你的targetAdd方法也没有boxId - 你必须将它作为参数之一传递。

因此,在这种情况下,您应该将boxId作为参数传递给targetAdd方法,并修改方法中的box文档。

仅在集合操作的上下文不重要的情况下使用集合挂钩。

答案 1 :(得分:0)

您可以将boxId传递给方法,然后传递给新记录,之后它将显示在钩子中:

public class AppContainer : IAppContainer
{
    private readonly ContainerBuilder _builder ;
    private IContainer _container ;

    public AppContainer ()
    {
        _builder = new ContainerBuilder();
        _builder.RegisterAssemblyModules(_assembly);

        _container = _builder.Build();
    }

    public ContainerBuilder ContainerBuilder
    {
        get { return _builder; }
    }

    public IContainer Container
    {
        get { return _container;}
    }

}