2012-10-31 13 views
6
> db.events.find() 
{ "_id" : ObjectId("50911c3e09913b2c643f1215"), "context" : "jvc8irfjc9cdnf93", "key" : "value" } 
{ "_id" : ObjectId("50911c4709913b2c643f1216"), "context" : "jvc8irfjc9cdnf93", "key" : "new value" } 
{ "_id" : ObjectId("50911c4b09913b2c643f1217"), "context" : "jvc8irfjc9cdnf93", "key" : "newer value" } 
{ "_id" : ObjectId("50911c4f09913b2c643f1218"), "context" : "jvc8irfjc9cdnf93", "key" : "newest value" } 
{ "_id" : ObjectId("50911c6309913b2c643f1219"), "context" : "0djd8vcndkfnjhv3", "key" : "value" } 

è un elenco di eventi su un server Mongo DB. Il cliente tiene traccia dell'ultimo evento di cui è a conoscenza, ad esempio 50911c4709913b2c643f1216, il secondo.Mongo DB: Ottieni tutti i documenti inseriti dopo l'ultimo noto

Come ottenere tutti gli eventi che sono stati inseriti dopo questo noto? In questo caso 50911c4b09913b2c643f1217, 50911c4f09913b2c643f1218 e 50911c6309913b2c643f1219.

risposta

1

Il motivo per cui vengono visualizzati gli ID oggetto in ordine crescente qui è perché la specifica dice che time|machine|pid|inc è il formato per la creazione di ObjectId.

Si noti che è già presente un componente orario nello ObjectId, ma è in secondi.
Il tipo Date in Mongo è la rappresentazione del numero di millisecondi di epoca, che ti darà un po 'più di precisione per capire il tempo di inserimento.

Penso che il modo migliore è quello di utilizzare un contatore in forma di Sequence numbers se avete bisogno di una precisione assoluta di là di millisecondi, ma se si pensa che l'applicazione non è che scrivere intensiva basta utilizzare il tipo di Date in la forma di una chiave aggiuntiva chiamata timestamp.

1

Nell'esempio si utilizzano gli ObjectIDs "built-in". They attempt to be unique, not sequential. È possibile aggiungere un timestamp e utilizzare i numeri di sequenza come suggeriscono i documenti ufficiali e eseguire query in base a tale attributo.

Dopo aver aggiunto questo nuovo attributo, è necessario eseguire due query. Uno per ottenere il numero sequenziale o il timestamp corrispondente all'ID client specificato e quindi un'altra query per ottenere gli elementi che vengono inseriti dopo.

3

Dal momento che l'ObjectId per default contiene un inc e un timestamp (http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification) si può effettivamente utilizzare il ObjectId per comprendere il tempo di inserimento (o meno) tramite:

db.col.find({_id: {$gt: {ObjectId("50911c4709913b2c643f1216")}}}); 

Tuttavia il ObjectId non può essere sempre estremamente affidabile, soprattutto se , nella tua app, crei lo ObjectId un po 'prima dell'inserimento e in realtà un record che sai è stato creato in seguito mostra effettivamente (a causa del suo _id) come prima.

Per inserimenti in alcuni scenari in cui non ci si può fidare della ObjectId per timer di inserimento è possibile aggiungere un campo ts di tipo BSON Data (ISODate) e della gamma a che l'utilizzo di due query, uno per ottenere il tempo di documenti originali e poi un altro per ottenere tutti i documenti dopo.

Personalmente preferisco semplicemente utilizzare il secondo metodo per utilizzare un tipo di data BSON poiché è più affidabile e flessibile.

0

Poiché ObjectID è basato sul tempo, come altri hanno già menzionato, possiamo costruire il nostro ObjectID basato sul tempo per l'interrogazione. Questo dovrebbe risparmiare spazio di indicizzazione :)

Vedere https://stackoverflow.com/a/8753670/1008449 per un'implementazione in Javascript.

Problemi correlati