Javascript Meteor observe更改服务器上添加的回调对所有项目激发
正在服务器上调用此代码。每次meteor服务器启动时,Javascript Meteor observe更改服务器上添加的回调对所有项目激发,javascript,meteor,Javascript,Meteor,正在服务器上调用此代码。每次meteor服务器启动时,added函数会为数据库中的每个项目激发。是否有方法仅在添加新项目时才让添加的回调触发?添加的将在第一次运行observeChanges时为结果集中的每个文档调用。诀窍是在初始化期间忽略回调。在我对问题的回答中有一个扩展的示例,但此代码应该适用于您: Tracker.autorun(function() { DATA.find().observeChanges({ added: function(id, doc) {
added
函数会为数据库中的每个项目激发。是否有方法仅在添加新项目时才让添加的回调触发?添加的将在第一次运行observeChanges
时为结果集中的每个文档调用。诀窍是在初始化期间忽略回调。在我对问题的回答中有一个扩展的示例,但此代码应该适用于您:
Tracker.autorun(function() {
DATA.find().observeChanges({
added: function(id, doc) {
console.log(doc);
}
});
});
请注意,这是一个仅限客户端的函数。在服务器上,我认为它只执行过一次。我为此挣扎了很长一段时间。出于某种原因,David的回答对我不起作用——它是在初始化变量设置为false后触发的
Avi的这种模式对我来说是成功的:
(function() {
var initializing = true;
DATA.find().observeChanges({
added: function(id, doc) {
if (!initializing) {
console.log(doc);
}
}
});
initializing = false;
})();
因为这是初始化问题,所以您可以这样做
var usersLoaded = false;
Meteor.subscribe("profiles", function () {
// at this point all new users sent down are legitimately new ones
usersLoaded = true;
});
Meteor.users.find().observe({
added: function(user) {
if (usersLoaded) {
console.log("New user created: ", user);
}
}
});
这实际上更优雅。这里有另一种解决方法:
Meteor.subscribe('messages',function()){
var messages=messages.find();
var msgCount=messages.count();
注意({
添加数据:函数(文档,索引){
if(atIndex>(msgCount-1))console.log('added');
}
});
});
应仅针对在现有金额交付后添加的文档激发。这在Meteor.subscribe
的onReady
回调中很重要,以便msgCount
随着订阅的变化而变化。。。例如,如果您正在对订阅进行分页
为与旧项不匹配的查询提供选择器。如果将mongo ObjectID用作\u id
,则可以查询\u id
大于最新项目的项目:
var observerOfMessages = Messages.find({}).observe({
added: function(doc){
if(!observerOfMessages) return;
console.log(doc)
}
});
或使用createdAt
时间戳:
const latest = DATA.findOne({}, {sort: {_id: -1}})
DATA.find({_id: {$gt: latest._id}}).observeChanges({
added: function() { ... }
})
这太简单了,我好几天都想不出来。谢谢你!我真愚蠢,竟然没有意识到Deps.autorun只是一个客户端。现在我还有一个问题…如果你能解释一下。如果我在一个非常大的集合上运行这个函数,并且从不调用stop,那么现在Meteor使用oplog,它会对我的系统造成严重的负担吗。@你想要after和before hooks功能吗@PeppeL-G所以你会说使用前后挂钩比观察变化更好?假设我的用例是每次将文档添加到集合中时,修改它,然后将其添加到另一个集合中。另外,我刚刚浏览了整个文档。它看起来很像观测变化。有什么区别吗?@Bads只是把它作为一种选择。我认为这个包不适用于游标,所以我认为这个解决方案不会有您在解决方案中提到的内存缺陷(如果存在)。@PeppeL-G。我明白了。谢谢我将对这两种解决方案进行试验。@chaintngprofiles
可能是John在出版Meteor.users
收藏的地方命名他的出版物的方式
const currentTime = new Date()
DATA.find({createdAt: {$gt: currentTime}}).observeChanges({
added: function() { ... }
})