Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor订阅更改时本地集合中存在重复ID_Meteor_Minimongo - Fatal编程技术网

Meteor订阅更改时本地集合中存在重复ID

Meteor订阅更改时本地集合中存在重复ID,meteor,minimongo,Meteor,Minimongo,以下是我的设想: 我有一套日历事件。某些事件附加了重复规则。在客户端订阅事件时,我正在创建一个名为LocalEvents的新本地集合。我循环浏览从events集合中发布的所有事件,并在我的本地集合中为每次事件插入一个新文档 这是我的代码和注释 //create reactive variable const searchQuery = new ReactiveVar(null); export default createContainer(({ params }) => { /

以下是我的设想:

我有一套日历事件。某些事件附加了重复规则。在客户端订阅事件时,我正在创建一个名为
LocalEvents
的新本地集合。我循环浏览从
events
集合中发布的所有事件,并在我的本地集合中为每次事件插入一个新文档

这是我的代码和注释

//create reactive variable
const searchQuery = new ReactiveVar(null);

export default createContainer(({ params }) => {
    //subscribe to subscription passing the reactive var as the variable
    const subscription = Meteor.subscribe('Events.publications.admin.list.all', searchQuery.get());
    const loading = !subscription.ready();
    const allEvents = Events.find();

    //loop through cursor, if event recurs - create new document for the event and insert it in to LocalEvents collection
    allEvents.forEach(function(event) {
        if (event.eventRecurs) {
            //grab array of all recurring dates
            const dates = event.recurringDates;
            //loop through recurring dates and create new event document for each with a random ID and a parentId of the original event
            _.each(dates, (date) => {
                LocalEvents.insert({
                    '_id': Random.id(),
                    'name': event.name,
                    'description': event.description,
                    'defaultDate': date,
                    'parentId': event._id
                });
            })

        } else {
            //if event doesn't recur, set parentId and insert into local collection
            event.parentId = event._id;
            LocalEvents.insert(event);
        }
    });

    const events = LocalEvents.find({}, { sort: { defaultDate: 1 }}).fetch();
    //pass everything to the component
    return { loading, events, searchQuery };
}, AdminEventsAll);
我的问题是,当我的订阅发生变化时(通过使用搜索栏),似乎本地集合中仍然保存着一些文档,因为存在重复的事件实例。每次在UI中的搜索栏中按下一个键时,都会设置传递给订阅的参数(searchQuery)——这将创建一个反应式搜索。当我打字的时候,我看到每一个字母都是重复的。它基本上表明本地集合正在重新填充相同的文档,因此它们会一次又一次地重复

如何确保每次searchQuery更改时,容器中的集合都正确清空

提前谢谢

**编辑找到的解决方案**


我添加了我找到的解决方案作为答案

对于其他有类似问题的人,我设法找到了解决方案

我补充说

Tracker.autorun(function(allEvents) {
    LocalEvents.remove({});
});
现在,只要订阅中的光标发生变化(例如,当用户搜索并更改
searchQuery
reactive var时),跟踪器功能就会清除本地集合,然后重新填充