2014-01-25 3 views
13
Tracker.autorun(function() { 
    DATA.find().observeChanges({ 
    added: function(id, doc) { 
     console.log(doc); 
    } 
    }); 
}); 

Dieser Code wird auf dem Server aufgerufen. Jedes Mal, wenn der Meteorserver gestartet wird, wird die added-Funktion für jedes einzelne Element in der Datenbank ausgelöst. Gibt es eine Möglichkeit, das Callback-Signal added nur dann zu erhalten, wenn neue Elemente hinzugefügt werden?Meteor Beobachtung Änderungen hinzugefügt Rückruf am Server feuert auf alle Artikel

Antwort

20

added wird für jedes Dokument in der Ergebnismenge aufgerufen, wenn observeChanges zum ersten Mal ausgeführt wird. Der Trick besteht darin, den Rückruf während dieser Initialisierungsperiode zu ignorieren. Ich habe ein erweitertes Beispiel in meiner Antwort auf this Frage, aber dieser Code sollte für Sie arbeiten:

(function() { 
    var initializing = true; 
    DATA.find().observeChanges({ 
    added: function(id, doc) { 
     if (!initializing) { 
     console.log(doc); 
     } 
    } 
    }); 
    initializing = false; 
})(); 

Beachten Sie, dass Tracker.autorun eine reine Client-Funktion ist. Auf dem Server denke ich es wird nur einmal ausgeführt.

+0

Das ist so einfach und ich konnte es nicht herausfinden, für Tage. Vielen Dank! Wie dumm von mir zu erkennen, dass Deps.autorun nur Client ist. Jetzt habe ich noch eine Frage ... wenn du etwas Licht werfen könntest. Wenn ich diese Funktion auf einer sehr großen Sammlung ausführe und niemals einen Stop rufe, würde Meteor nun, da Meteor oplog benutzt, mein System schlecht besteuern. – Bads

+0

@Bads Sie wollen die after und before hooks Funktionalität? https://github.com/matb33/meteor-collection-hooks –

+0

@ PeppeL-G Also würden Sie sagen, dass die Verwendung der After- und Vorher-Hooks ist besser als Änderungen beobachten? Sagen wir, mein Anwendungsfall ist jedes Mal, wenn ein Dokument einer Sammlung hinzugefügt wird, modifiziere es und füge es dann einer anderen Sammlung hinzu. Ich habe auch nur das gesamte Dokument durchgesehen. Es sieht genauso aus wie "Änderungen beobachten". Was ist der Unterschied? – Bads

8

Ich kämpfte mit diesem für eine lange Zeit. Aus irgendeinem Grund funktionierte Davids Antwort für mich nicht - es wurde ausgelöst, nachdem die Initialisierungsvariable auf "false" gesetzt wurde.

Dieses Muster wird von Avi war für mich erfolgreich:

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); 
     } 
    } 
}); 
+0

Welche 'Profile' bezogen sich auf Sammlung' Benutzer'? – chaintng

+1

@chaunstng 'Profile' ist wahrscheinlich, wie John seine Publikation nannte, in der er die' Meteor.users' Sammlung veröffentlicht – Minderov

2

Da es Initialisierung Problem ist, können Sie dies tun.

var observerOfMessages = Messages.find({}).observe({ 
    added: function(doc){ 
     if(!observerOfMessages) return; 
     console.log(doc) 
    } 
}); 

Dies ist eigentlich eleganter.

1

Hier ist eine andere Möglichkeit, dies zu lösen:

Meteor.subscribe('messages', function() { 
    var messages = Messages.find(); 
    var msgCount = messages.count(); 

    messages.observe({ 
     addedAt: function(doc, atIndex) { 
      if(atIndex > (msgCount - 1)) console.log('added'); 
     } 
    }); 
}); 

Sollte nur Feuer für Dokumente nach dem vorhandenen Menge hinzugefügt geliefert wird. Es ist wichtig, dass dies in einem onReady Rückruf für Meteor.subscribe geht, so dass die msgCount ändert, wie Ihr Abonnement tut ... wenn Sie zum Beispiel Ihre Abonnements paginieren.

cursor.observe() documentation

2

einen Selektor für die Abfrage bereitzustellen, die nicht alte Elemente entspricht. Wenn _id mit Mongo ObjectID als könnten Sie nach Artikeln abfragen, die _id größer ist als der letzte Punkt des haben:

const latest = DATA.findOne({}, {sort: {_id: -1}}) 
DATA.find({_id: {$gt: latest._id}}).observeChanges({ 
    added: function() { ... } 
}) 

Oder mit createdAt Zeitstempel:

const currentTime = new Date() 
DATA.find({createdAt: {$gt: currentTime}}).observeChanges({ 
    added: function() { ... } 
}) 
Verwandte Themen